SQL NO CHECK FOREIGN KEY数据后,重新启用查询优化器

时间:2012-08-31 19:41:39

标签: sql-server foreign-keys

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

我需要重新创建Countries表,所以我从States表中删除此FOREIGN KEY(否则它不允许我使用DROP国家/地区)

在我这样做之后,我想在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允许我毫无错误地继续进行。

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

 ALTER TABLE States
      CHECK CONSTRAINT ALL
 GO

我认为这应该会引起错误。

1 个答案:

答案 0 :(得分:17)

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

 ALTER TABLE States
      WITH CHECK CHECK CONSTRAINT ALL
 GO

和以前一样,这会抛出一个错误,直到你解决具有错误CountryID值的状态。