Невозможно создать ограничение FK - PullRequest
3 голосов
/ 15 января 2011

У меня есть 2 таблицы:

TableA
------
TableAID INT IDENTITY Primary Key
TableBID INT NULL

I add a unique constraint on TableBID
ALTER TABLE TableAID ADD CONSTRAINT xx UNIQUE ([TableBID])

TableB
------
TableBID INT IDENTITY Primary Key

Теперь, когда я удаляю строку TableA, мне нужно также удалить TableB, поэтому я пытаюсь добавить FK с каскадным удалением

ALTER TABLE TableB ADD CONSTRAINT yy FOREIGN KEY (TableBID) 
REFERENCES TableA (TABLEBID) ON DELETE CASCADE

Но я получаю эту ошибку:

Msg 1788, Level 16, State 0, Line 1
Cascading foreign key 'yy' cannot be created where the referencing column 'TableB.TableBID' is an identity column.

Ответы [ 3 ]

9 голосов
/ 15 января 2011

TableB.TableBID не может быть одновременно столбцом IDENTITY (который вычисляется независимо) и в то же время быть внешним ключом столбца в другой таблице.

Я думаю, что вы изменили свои отношения и действительно хотите:

ALTER TABLE TableA ADD CONSTRAINT yy FOREIGN KEY (TableBID) 
REFERENCES TableB (TABLEBID) ON DELETE CASCADE
0 голосов
/ 10 декабря 2013

Я удалил спецификацию идентификатора при оформлении таблицы .. тогда это сработало

0 голосов
/ 15 января 2011

Теперь, когда я удаляю строку TableA, мне нужно также удалить TableB, поэтому я пытаюсь добавить FK с каскадным удалением

Этот сценарий требует от вас создания отношений другим способом. В противном случае создайте триггер в A, который удалит соответствующую запись в B при удалении A.

Когда я переключал таблицы, ошибка исчезла, но я не должен добавлять ограничение на TableB, поскольку я хочу, чтобы строка TableB удалялась при удалении строки TableA.

FK подразумевает, что мастером является B, и одна или несколько записей в A ссылаются на него (в вашем случае вы ограничили его однозначным использованием уникального ключа). Каскадное удаление удаляет дочернюю часть FK при удалении мастера, поэтому delete B -> удаляет соответствующий A, а не наоборот. Вам нужен триггер для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...