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.