Ошибка foreign key reference target does not exist

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:

  1. Drop Foreign Key constraints in dependent tables.
  2. Sync two tables (which means renewing/changing IDs in table Person)
  3. Change appropriate IDs in dependent tables.
  4. 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):

  1. ALTER TABLE employee DROP CONSTRAINT fk_employee_person
    
  2. UPDATE person SET id = 555555 WHERE id = 3000005
    
  3. UPDATE employee SET person_id = 555555 WHERE person_id = 3000005
    
  4. 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 :-)

Понравилась статья? Поделить с друзьями:
  • Ошибка gpu does not support
  • Ошибка garry s mod steam error no steam user
  • Ошибка game crash в форест
  • Ошибка ford s max p0171
  • Ошибка gpu does not meet minimal requirements