I need to synchronize data in two tables from different Firebird databases. Precisely, I need to update records in table Person (1st DB), using records from table Users (2nd DB). Not only «name», «email», «birthday», but ID also (!). The problem is — there are tables, that depend on Person’s IDs through FOREIGN KEY Constraint.
I’m trying to do this:
- Drop Foreign Key constraints in dependent tables.
- Sync two tables (which means renewing/changing IDs in table Person)
- Change appropriate IDs in dependent tables.
- Adding Foreign Key constraints in dependent tables.
Last step causes a error (log from java application, but it’s the same if I perform these steps directly in IBExpert):
com.bssys.db.jdbc.DBSQLException: GDS Exception. 335544466. violation of FOREIGN KEY constraint "FK_EMPLOYEE_PERSON" on table "EMPLOYEE"
Foreign key reference target does not exist, error code: HY000
Reason: violation of FOREIGN KEY constraint "FK_EMPLOYEE_PERSON" on table "EMPLOYEE"
(Employee — is one of the dependent tables)
My question is, whether I can avoid this error. Or maybe there are some ideas on how to change IDs in related tables. There are probably special RDBMS tools to sync databases, but I need to sync them through Java application, therefore using only sql and java. I use Firebird 2.5.1.
Complete SQL-statements (example):
-
ALTER TABLE employee DROP CONSTRAINT fk_employee_person
-
UPDATE person SET id = 555555 WHERE id = 3000005
-
UPDATE employee SET person_id = 555555 WHERE person_id = 3000005
-
ALTER TABLE employee ADD CONSTRAINT fk_employee_person FOREIGN KEY (person_id) REFERENCES person(id)
Some new information: it seems like sometimes IBExpert allows me to go through these steps. Actually, it gives an error in case I changed all IDs while one of the tables were in the «DATA» mode (I suppose, it’s also some kind of transaction, like CREATE VIEW
).
I also found out that removing/adding Foreign Key requires exclusive lock on the whole database at least till Firebird 2.1 (or even 2.5)
Предпринимаю попытку перевода базы в 1 диалекте с ib 7.5 на firebird 2.0.1 (пока superserver). Все вроде нормально, но при ресторе базы под fb 2 индекса в одной таблице не активируются. Подскажите plz с чем может быть связана ошибка? Чувствую, что все на самом деле просто, а доказать не могу Структура таблиц следом за логом:
gbak: activating and creating deferred index RDB$FOREIGN66
gbak:cannot commit index RDB$FOREIGN66
gbak: ERROR:violation of FOREIGN KEY constraint «PKDOCUMENTS» on table «DOCUMENTS»
gbak: ERROR: Foreign key reference target does not exist
gbak: activating and creating deferred index RDB$FOREIGN67
gbak:cannot commit index RDB$FOREIGN67
gbak: ERROR:violation of FOREIGN KEY constraint «PKDOCUMENTS» on table «DOCUMENTS»
gbak: ERROR: Foreign key reference target does not exist
gbak: activating and creating deferred index RDB$FOREIGN50
……….
gbak: committing metadata
gbak:finishing, closing, and going home
gbak:Database is not online due to failure to activate one or more indices.
gbak:Run gfix -online to bring database online without active indices.
Индексы RDB$FOREIGN66 и RDB$FOREIGN67 принадлежат таблице DOCUMENTLINKS следующей структуры:
Код: Выделить всё
CREATE TABLE DOCUMENTLINKS (
DEBETDOC INTEGER NOT NULL,
CREDITDOC INTEGER NOT NULL,
LINKSUMMA DOUBLE PRECISION NOT NULL,
LINKTYPE SMALLINT NOT NULL
);
ALTER TABLE DOCUMENTLINKS ADD CONSTRAINT PKDOCUMENTLINKS PRIMARY KEY (DEBETDOC, CREDITDOC); /* RDB$PRIMARY10 */
ALTER TABLE DOCUMENTLINKS ADD FOREIGN KEY (DEBETDOC) REFERENCES DOCUMENTS (ID); /* это RDB$FOREIGN66 */
ALTER TABLE DOCUMENTLINKS ADD FOREIGN KEY (CREDITDOC) REFERENCES DOCUMENTS (ID); /* это RDB$FOREIGN67 */
Структура таблицы DOCUMENTS, на которую ссылаются внешние ключи:
Код: Выделить всё
CREATE TABLE DOCUMENTS (
ID INTEGER NOT NULL,
FIRM INTEGER NOT NULL,
OPERATIONDATE DATE NOT NULL,
KIND INTEGER NOT NULL,
TOTALSUM DOUBLE PRECISION DEFAULT 0 NOT NULL,
CURRENCY INTEGER NOT NULL,
CURRRATE DOUBLE PRECISION,
PARTNER INTEGER NOT NULL,
AGENT INTEGER NOT NULL,
STOCK INTEGER NOT NULL,
IMPORTED_ID INTEGER DEFAULT 0 NOT NULL,
FLAG INTEGER DEFAULT 0 NOT NULL,
DOCTYPE INTEGER NOT NULL,
DOCNUMBER VARCHAR(10) NOT NULL COLLATE PXW_CYRL,
DOCDATE DATE NOT NULL,
DOCCURRENCY INTEGER NOT NULL,
DOCCURRRATE DOUBLE PRECISION,
PREV_DOCTYPE INTEGER,
PREV_DOCNUMBER VARCHAR(10) COLLATE PXW_CYRL,
PREV_DOCDATE DATE,
EXPECTEDDATE DATE NOT NULL,
SCHEME SMALLINT default 0 NOT NULL,
CONTRACT INTEGER default 0 NOT NULL,
REALDOCTYPE INTEGER NOT NULL
);
ALTER TABLE DOCUMENTS ADD CONSTRAINT PKDOCUMENTS PRIMARY KEY (ID);
/******************************************************************************/
/*** Foreign Keys ***/
/******************************************************************************/
ALTER TABLE DOCUMENTS ADD CONSTRAINT FKDOC_TYPE FOREIGN KEY (REALDOCTYPE) REFERENCES T$DOCUMENT_TYPES (ID);
ALTER TABLE DOCUMENTS ADD FOREIGN KEY (DOCTYPE) REFERENCES T$DOCUMENT_TYPES (ID);
ALTER TABLE DOCUMENTS ADD FOREIGN KEY (KIND) REFERENCES T$KINDS (ID);
ALTER TABLE DOCUMENTS ADD FOREIGN KEY (CURRENCY) REFERENCES CURRENCIES (ID);
ALTER TABLE DOCUMENTS ADD FOREIGN KEY (PARTNER) REFERENCES PARTNERS (ID);
ALTER TABLE DOCUMENTS ADD FOREIGN KEY (AGENT) REFERENCES PARTNERS (ID);
ALTER TABLE DOCUMENTS ADD FOREIGN KEY (FIRM) REFERENCES PARTNERS (ID);
ALTER TABLE DOCUMENTS ADD FOREIGN KEY (STOCK) REFERENCES PARTNERS (ID);
/******************************************************************************/
/*** Indices ***/
/******************************************************************************/
CREATE INDEX DOCUMENTS_IDX_BROWSE ON DOCUMENTS (DOCTYPE, DOCDATE);
CREATE INDEX ELDOC_BROWSE ON DOCUMENTS (PREV_DOCDATE, REALDOCTYPE);
CREATE INDEX IDOCNUMBER ON DOCUMENTS (DOCNUMBER);
CREATE DESCENDING INDEX IXDOCUMENTS_BROWSE ON DOCUMENTS (OPERATIONDATE, DOCTYPE);
p.s. поиском нашел только 1 описание похожей ошибки в инете — там написано, что это может быть связано с ошибками индексов основной таблицы. Запускал валидацию — ошибок нет, да и откуда им взяться сразу после рестора. Заранее спасибо.
Или у меня просто дубли в поле ID таблицы DOCUMENTS? Так там вроде уникальный primary key по этому полю.
← →
PEAKTOP ©
(2006-11-18 13:38)
[0]
Доброе время суток
Есть таблицы
CREATE TABLE TABL$MASTER(
ID INTEGER NOT NULL,
.....
);
ALTER TABLE TABL$MASTER
ADD CONSTRAINT C_PK$MASTER_ID PRIMARY KEY (ID) USING INDEX INDX$MASTER_ID;
CREATE TABLE TABL$DETAIL(
MASTER_ID INTEGER NOT NULL,
........
);
При попытке создать внешний ключ
ALTER TABLE TABL$DETAIL
ADD CONSTRAINT C_FK$DETAIL_MASTER_ID FOREIGN KEY (MASTER_ID) REFERENCES TABL$MASTER (ID) ON DELETE CASCADE ON UPDATE CASCADE USING INDEX INDX$DETAIL_MASTER_ID;
Выдает ошибку
Невозможно подтвердить транзакцию:
violation of FOREIGN KEY constraint "".
violation of FOREIGN KEY constraint "C_PK$MASTER_ID" on table "TABL$MASTER".
Foreign key reference target does not exist.
Ошибка даже не в выполнении скрипта на COMMIT транзакции. В структуре базы на таблицу TABL$MASTER ссылается уже с десяток таблиц. Попробовал монопольно к базе подключиться — тоже самое.
В чем дело может быть ?
← →
unknown ©
(2006-11-18 17:40)
[1]
Хм.
После изменения метаданных следует реконнект делать.
А точно reference target exist ?
Если проблема не в этом — тогда gfix-ом ошибки искать.
← →
PEAKTOP ©
(2006-11-18 18:42)
[2]
> После изменения метаданных следует реконнект делать.
В том и вопрос, что не могу я это изменение метаданных сделать.
......
IBSQL.ExecSQL; // пока все нормально
IBSQL.Transaction.Commit; // Вот здесь и ловим исключение.
.....
В IBExpert-e тоже самое.
← →
PEAKTOP ©
(2006-11-18 18:49)
[3]
Нашел. В таблице TABL$DETAIL была кривая запись. Выполнение скрипта
DELETE FROM TABL$DETAIL DD
WHERE NOT(EXISTS(SELECT MM.ID FROM TABL$MASTER MM WHERE (MM.ID = DD.MASTER_ID)))
все вылечило.
Пост считаю закрытым.
← →
Desdechado ©
(2006-11-18 20:17)
[4]
violation of FOREIGN KEY constraint
это переводится как наружение ссылочной целостности, т.е. очевидно, что есть записи, не удовлетворяющие этому условию
Создание внешнего ключа!!!
Добрый, Добрый День!!!
Объясните мне пожалуйста что это за ошибку выдает мне IB Expert при создание внешнего ключа:
violation of FOREIGN KEY constraint «».
violation of FOREIGN KEY constraint «PK_RASH_INS» on table «RASH_INS».
Foreign key reference target does not exist.
Скрипт -alter table RASH_PO_FACT add constraint FK_RASH_PO_FACT_1
foreign key (NOM_RASH) references RASH_INS(NOM_RASH)
Использую FB2.0
Структура таблиц такая:
Таблица Rash_ins (ord_num,nomenk_numb,kol_ins_rash,nom_rash),
Таблица Rash_po_Fact (rash_fact,data_fact,nom_rash);
12 ответов
Добрый, Добрый День!!!
Объясните мне пожалуйста что это за ошибку выдает мне IB Expert при создание внешнего ключа:
violation of FOREIGN KEY constraint «».
violation of FOREIGN KEY constraint «PK_RASH_INS» on table «RASH_INS».
Foreign key reference target does not exist.
Скрипт -alter table RASH_PO_FACT add constraint FK_RASH_PO_FACT_1
foreign key (NOM_RASH) references RASH_INS(NOM_RASH)
Использую FB2.0
Структура таблиц такая:
Таблица Rash_ins (ord_num,nomenk_numb,kol_ins_rash,nom_rash),
Таблица Rash_po_Fact (rash_fact,data_fact,nom_rash);
Цитата:
Имейте в виду, что при использовании ALTER TABLE вместо CREATE TABLE, для применения ограничения FOREIGN KEY, значения которые Вы указываете во внешнем ключе и родительском ключе, должны быть в состоянии справочной целостности. Иначе команда будет отклонена. Хотя ALTER TABLE очень полезна из-за ее удобства, вы должны будете в вашей системе, по возможности каждый раз, сначала формировать структурные принципы, типа справочной целостности.
м.б. из за отсутсвия справочной целостности
м.б. из за отсутсвия справочной целостности
Спасибо тебе oxotnik333!А не подскажешь как этого всего можно избежать?Что нужно выполнить чтоб создать справочную целостность и где можно взять литературу по этому поводу?В <Хелен Борри > такого не раскрыто!!!
Спасибо тебе oxotnik333!А не подскажешь как этого всего можно избежать?Что нужно выполнить чтоб создать справочную целостность и где можно взять литературу по этому поводу?В <Хелен Борри > такого не раскрыто!!!
вот статейка по поводу целостности и внешних ключей… м.б есть там что интересное по теме
вот статейка по поводу целостности и внешних ключей… м.б есть там что интересное по теме
Спасибо!!!
3.2K
22 марта 2008 года
Гудвин
186 / / 22.12.2007
помогите с запросом. использую MySQL 5.0+ADO
первая таблица создаётся без проблем:
Код:
CREATE TABLE diagram0_objects
(
id_obj integer NOT NULL AUTO_INCREMENT,
X_ Integer DEFAULT ‘0’ NOT NULL,
Y_ Integer DEFAULT ‘0’ NOT NULL,
H_ Integer DEFAULT ‘0’ NOT NULL,
W_ Integer DEFAULT ‘0’ NOT NULL,
Who_ Integer DEFAULT ‘0’ NOT NULL,
tag_ Integer DEFAULT ‘0’ NOT NULL,
type_ smallint DEFAULT ‘0’ NOT NULL,
str_ CHAR(25) NOT NULL,
PRIMARY KEY (id_obj));
на вторую, после того как добавил фк, начинает ругаеться, говорит can’t create table diagram0_objects_attributes.frm (errno: 150)
Код:
CREATE TABLE diagram0_objects_attributes
(
id_obj_attr integer UNSIGNED NOT NULL AUTO_INCREMENT,
Index_obj Integer DEFAULT ‘0’ NOT NULL,
str_ CHAR(25) NOT NULL,
PRIMARY KEY (id_obj_attr),
FOREIGN KEY (Index_obj) REFERENCES diagram0_objects
);
чево ему не хватает?
8.2K
23 марта 2008 года
Ora-cool
211 / / 20.09.2007
Как минимум вы не указали на какой столбец таблицы ссылается внешний ключ.
3.2K
23 марта 2008 года
Гудвин
186 / / 22.12.2007
спасибо сработало) а я почему-то думал что если не указывать то он будет ссылаться по умолчанию на праймари кей
3.2K
10 сентября 2008 года
Гудвин
186 / / 22.12.2007
помогите разобраться.
есть две таблицы
Код:
CREATE TABLE `bd_auto` (
`ID_AUTO` int(11) NOT NULL auto_increment,
`LINE` tinytext NOT NULL,
PRIMARY KEY (`ID_AUTO`)
);
CREATE TABLE `bd_auto_set` (
`ID_SET` int(11) NOT NULL auto_increment,
`INDEX_TABLE` int(11) NOT NULL default ‘0’,
`LINE` tinytext NOT NULL,
`QUOTE` tinytext NOT NULL,
FOREIGN KEY (INDEX_TABLE) REFERENCES `bd_auto` (ID_AUTO) ON DELETE CASCADE,
PRIMARY KEY (`ID_SET`)
);
я так понимаю при удалении из bd_auto автоматически должны удаляться дочерние записи из bd_auto_set, но вылезает ошибка:
Cannot delete or update a parent row: a foreign key constraint fails
Приходится вручную транзакцией очищать дочернюю таблицу а потом удалять эту запись. В чем ошибка?:confused:
8.2K
10 сентября 2008 года
Ora-cool
211 / / 20.09.2007
А может есть другие таблицы, ссылающиеся на bd_auto?
3.2K
10 сентября 2008 года
Гудвин
186 / / 22.12.2007
нет, ни одной. просто это не одна такая связь, и везде такая же ситуация.:(
1
10 сентября 2008 года
kot_
7.3K / / 20.01.2000
Приходится вручную транзакцией очищать дочернюю таблицу а потом удалять эту запись. В чем ошибка?:confused:
Каскадное удаление возможно только для таблиц InnoDB
3.2K
11 сентября 2008 года
Гудвин
186 / / 22.12.2007
спасибо, разобрался.:)
Commented by: @hvlad
I have no idea of what is #1 message. isql didn’t report it while IBE does.
Perhaps its related with SQLERR message at messages2.sql number 470 :
(NULL, NULL, NULL, NULL, 13, 470, NULL, ‘violation of FOREIGN KEY constraint «@1″‘, NULL, NULL);
Message #2 was wrong and i fixed it in HEAD
Message #3 requires just some knowledge of english language or access to some translator