Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Создание внешнего ключа - глюк ? [FireBird 2.0.0.12748]


PEAKTOP ©   (2006-11-18 13:38:00) 

Доброе время суток
Есть таблицы

CREATE TABLETABL$MASTER(
 ID INTEGER NOT NULL,
 .....
);

ALTER TABLETABL$MASTER
  ADD CONSTRAINTC_PK$MASTER_ID PRIMARY KEY(ID) USING INDEXINDX$MASTER_ID;

CREATE TABLETABL$DETAIL(
 MASTER_ID INTEGER NOT NULL,
 ........
);

При попытке создать внешний ключ

ALTER TABLETABL$DETAIL
  ADD CONSTRAINTC_FK$DETAIL_MASTER_ID FOREIGN KEY(MASTER_ID) REFERENCESTABL$MASTER (ID) ON DELETE CASCADE ON UPDATE CASCADE USING INDEXINDX$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 ссылается уже с десяток таблиц. Попробовал монопольно к базе подключиться - тоже самое.
В чем дело может быть ?


Desdechado   (2006-11-18 20:17:00) [1]

violation of FOREIGN KEY constraint
это переводится как наружение ссылочной целостности, т.е. очевидно, что есть записи, не удовлетворяющие этому условию


PEAKTOP   (2006-11-18 18:49:00) [2]

Нашел. В таблице TABL$DETAIL была кривая запись. Выполнение скрипта

DELETE FROMTABL$DETAIL DD
WHERE NOT( EXISTS( SELECTMM.ID FROMTABL$MASTER MM WHERE(MM.ID = DD.MASTER_ID)))

все вылечило.

Пост считаю закрытым.


PEAKTOP   (2006-11-18 18:42:00) [3]

> После изменения метаданных следует реконнект делать.

В том и вопрос, что не могу я это изменение метаданных сделать.

 ......
 IBSQL.ExecSQL; // пока все нормально
 IBSQL.Transaction.Commit; // Вот здесь и ловим исключение.
 .....
 
В IBExpert-e тоже самое.


unknown   (2006-11-18 17:40:00) [4]

Хм.
После изменения метаданных следует реконнект делать.
А точно reference target exist ?
Если проблема не в этом - тогда gfix-ом ошибки искать.


Наверх

Титульная страница Поиск, карта сайта Написать письмо