SQL NO CHECK FOREIGN KEY после данных, повторное включение оптимизатора запросов
У меня есть db SQL Server 2012 с ограничением внешнего ключа, который ссылается на Countries.CountryID = States.CountryID
Мне нужно было воссоздать таблицу Countries
, чтобы я DROP этот ИНОСТРАННЫЙ КЛЮЧ из таблицы States
(иначе это не позволило бы мне в DROP странах)
После этого я хочу воссоздать FK на States
, но это не позволяет мне, если я не укажу NO CHECK
как таковой:
ALTER TABLE States
WITH NOCHECK
ADD CONSTRAINT FK_StatesCountries FOREIGN KEY (CountryID) REFERENCES Countries(CountryID)
GO
Вначале я не понял, что некоторые строки из строк имели CountryID
, у которых не было соответствующей записи Countries.CountryID
. Очевидно, WITH NOCHECK
разрешил мне действовать без ошибок.
Теперь SQLServer отметит этот FK как "не доверенный", MSDN заявляет о необходимости повторного включения оптимизатора запросов, проверяя все ограничения. Так почему же следующая строка НЕ дает мне ошибку, хотя некоторые государства имеют недопустимый CountryID?
ALTER TABLE States
CHECK CONSTRAINT ALL
GO
Я бы подумал, что это должно было вызвать ошибку.
Ответы
Ответ 1
Чтобы повторить ограничения, вам нужно будет использовать этот синтаксис, который, по общему признанию, выглядит немного странным. WITH CHECK
- это то, что вызывает проверку существующих данных.
ALTER TABLE States
WITH CHECK CHECK CONSTRAINT ALL
GO
Как и прежде, это приведет к ошибке, пока вы не разрешите состояния с плохими значениями CountryID.