Страница 1 из 1

foreign key trouble

Добавлено: 28 апр 2005, 19:08
bestrafer
Приветствую.
Имею IB 6.0

Код: Выделить всё

CREATE TABLE T1 (
    ...
    ID  INTEGER NOT NULL
    ...
);

ALTER TABLE T1 ADD CONSTRAINT A1_UNQ1 UNIQUE (ID);

CREATE UNIQUE INDEX IDX1_T1 ON T1 (ID);
и

Код: Выделить всё

CREATE T2 (
    ID1  INTEGER NOT NULL,
    ID2  INTEGER NOT NULL
);
теперь пытаюсь сделать ограничение с T2(ID1) на T1(ID)

Код: Выделить всё

alter table T2 add constraint FK_SP_1 foreign key (ID1) references T1(ID)
Получаю:
This operation is not defined for system tables.
unsuccessful metadata update.
STORE RDB$REF_CONSTRAINTS failed.
action cancelled by trigger (1) to preserve data integrity.
Name of Referential Constraint not defined in constraints table.
Это читал
не удается создать вторичный ключ (FK)

при ALTER TABLE X ADD [constraint FK_X] FOREIGN KEY (ID) REFERENCES Y (ID);

выдается сообщение

"unsuccessful metadata update, STORE RDB$REF_CONSTRAINTS failed,
action cancelled by trigger (1) to preserve data integrity,
Name of Referential Constraint not defined in constraints table."

A: в IB 6.0 (например 6.0.0.627) не удается сделать FK, если у таблицы Y к этому моменту уже есть FK по ID от любой другой таблицы, или просто индекс по полю ID, название которого начинается с буквы меньше S. Либо нужно сменить версию (в Firebird RC2 такой ошибки нет, как ее нет и в IB 5.6), либо располагать создание FK отдельно, в порядке detail-master, после чего создавать индексы (если по этим полям они вообще нужны).
Но, вроде, под описанные условия не подпадаю.
Подскажите, что делаю не так.

Re: foreign key trouble

Добавлено: 28 апр 2005, 19:33
dimitr
bestrafer писал(а):Подскажите, что делаю не так.
имеешь IB 6.0

Добавлено: 28 апр 2005, 19:40
Merlin
Не, это она его имеет. А ещё он сам себе мозги имеет, создавая индекс, идентичный тому, который она создаёт автоматически. При этом опять же автоматически попадая именно на то, про что он прочитал, но не поверил, что попал.

Добавлено: 29 апр 2005, 00:14
kdv
кроме того, не unique надо создавать, а primary key. unique это АЛЬТЕРНАТИВНЫЙ КЛЮЧ, а не ПЕРВИЧНЫЙ КЛЮЧ, см. книжки по РСУБД.

Добавлено: 29 апр 2005, 14:08
bestrafer
kdv писал(а):кроме того, не unique надо создавать, а primary key. unique это АЛЬТЕРНАТИВНЫЙ КЛЮЧ, а не ПЕРВИЧНЫЙ КЛЮЧ, см. книжки по РСУБД.
Меня праймери не устраивает. А что книжки по РСУБД говорят, что ссылаться можно можно только на праймери поле? :shock:

Добавлено: 29 апр 2005, 14:11
bestrafer
Merlin писал(а):Не, это она его имеет. А ещё он сам себе мозги имеет, создавая индекс, идентичный тому, который она создаёт автоматически. При этом опять же автоматически попадая именно на то, про что он прочитал, но не поверил, что попал.
Действительно лажанул, создавая дополнительный индекс. Достаточно
unique ограничения, индекс добавляется автоматом.
Спасибо.

Re: foreign key trouble

Добавлено: 29 апр 2005, 14:13
bestrafer
dimitr писал(а):
bestrafer писал(а):Подскажите, что делаю не так.
имеешь IB 6.0
Здорово, конечно, когда сам определяешь с какой СУБД работать.

Добавлено: 03 май 2005, 10:13
kdv
Здорово, конечно, когда сам определяешь с какой СУБД работать.
а кто заставляет, начальство? Им что, официальную бумагу надо о том, что это сильно устаревшая версия?

Добавлено: 04 май 2005, 19:00
bestrafer
kdv писал(а):
Здорово, конечно, когда сам определяешь с какой СУБД работать.
а кто заставляет, начальство? Им что, официальную бумагу надо о том, что это сильно устаревшая версия?
заказчик требует, ничего не попишешь

ничего, со временем осознают, заработаем на них еще :)

Добавлено: 04 май 2005, 19:19
kdv
ну раз заказчик требует, то хрен с ним.
Меня праймери не устраивает
еще раз про разницу unique и PK. В IB 6.0 по ним строятся одинаковые индексы, не допускающие null. В FB 1.5 unique уже допускает null, как и положено альтернативному (а не первичному ключу).

Так что, primary тебя "не устраивать" не может ни в первом, ни во втором случае.
Если этот DDL генерится из CASE, настрой его, чтобы он не unique делал, а primary key. Любой, кто разбирается в проектировании БД, сразу скажет что использовать только unique - лажа.

Добавлено: 04 май 2005, 19:25
Merlin
kdv писал(а): Любой, кто разбирается в проектировании БД, сразу скажет что использовать только unique - лажа.
Тихо! Не спугни закашшика. Он же на нём ещё много раз потом заработать хочет ;)