2011-04-21 2 views
3

Я использую SQL Server, и мне нужно добавить внешний ключ к уже существующей таблице.Проблемы с добавлением ограничения внешнего ключа в SQL Server?

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

Мне было интересно, когда я изменяю таблицу и добавляю ограничение внешнего ключа, что произойдет с строками в таблице с ограничениями внешнего ключа, которые имеют непоследовательные значения?

--Neeraj

ответ

2

В этом случае это ваше решение. Эти значения можно оставить в таблице, используя предложение WITH NOCHECK. Но все новые вставленные значения будут проверены.

+1

, или если вы не укажете 'WITH NOCHECK', тогда ограничение FK не будет создано, так как в дочерней таблице есть строки зомби ... –

+0

Какое исключение делает NO CHECK do ?? – Neeraj

+0

можно создать внешний ключ с недействительными данными до того, как вы его создадите. Иными словами, FK будет создан, но никакой проверки данных не будет. Когда вы введете новые данные, он будет проверен. – Dalex

1

Вы получите сообщение об ошибке, и ничего не будет вставлено.

Чтобы найти все противоречивые строки (если предположить, что A и B являются целевыми таблицами, A.id является родительским ключом и B.fk_id ребенок, внешний ключ, идентификатор):

SELECT B.fk_id 
    FROM B 
LEFT JOIN A ON A.id = B.fk_id 
    WHERE A.id IS NULL 

После его выполнения вы будете имеют все дочерние строки, которые ссылаются на «нигде». Поэтому вам нужно либо удалить их, либо изменить, чтобы указать на существующие строки, либо установить B.fk_id на NULL (если нет ограничения NOT NULL).

И после этого запроса возвращается 0 строк - вы можете безопасно создать ограничение внешнего ключа без каких-либо магических опций.

+0

строки с несогласованными данными уже существуют. – Neeraj

+0

@Neeraj: исправить данные для согласования и создать ограничение. В противном случае бессмысленно использовать ограничения вообще. – zerkms

+0

@zerkms: ok .. но incase Я не удаляю эти конкретные ключи, с какими проблемами я сталкиваюсь, когда я изменяю таблицу, я говорю о проблемах, таких как строки, которые исчезают из-за их собственных углов, у них есть непоследовательный внешний ключ или любой проблемы, связанные с потерей данных. – Neeraj

Смежные вопросы