我有一个带有引用Countries.CountryID = States.CountryID的外键约束的SQL Server 2012数据库

我需要重新创建Countries表,因此我从States表中删除此FOREIGN KEY(否则将不允许我删除国家/地区)

之后,我想在States上重新创建FK,但是除非我这样指定NO CHECK,否则它不允许我这样做:

ALTER TABLE States
    WITH NOCHECK
    ADD CONSTRAINT FK_StatesCountries FOREIGN KEY (CountryID) REFERENCES Countries(CountryID)
GO


起初我没有意识到某些州的行有CountryID没有匹配的Countries.CountryID记录。显然WITH NOCHECK允许我继续进行而没有错误。

现在,将此FK标记为“不可信”的SQLServer,MSDN表示通过检查所有约束来重新启用查询优化器。那么,为什么即使某些州的CountryID无效,以下行也不会给我错误?

 ALTER TABLE States
      CHECK CONSTRAINT ALL
 GO


我认为这应该引起一个错误。

最佳答案

为了使约束再次受信任,您需要使用此语法,这看起来有些奇怪。 WITH CHECK是导致现有数据验证的原因。

 ALTER TABLE States
      WITH CHECK CHECK CONSTRAINT ALL
 GO


和以前一样,这将引发错误,直到您解析具有错误CountryID值的州为止。

关于sql-server - 数据后的SQL NO CHECK FOREIGN KEY,重新启用查询优化器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12221584/

10-09 18:14