16

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

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

在我这样做之后,我想重新创建 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

我认为这应该引发错误。

4

1 回答 1

17

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

 ALTER TABLE States
      WITH CHECK CHECK CONSTRAINT ALL
 GO

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

于 2012-08-31T19:43:53.003 回答