违反外键 (SQL Server 2012)

Rah*_*rma 2 sql-server foreign-keys

我很惊讶地发现子表有一些父表没有的键,并且 SQL Server 在插入数据时没有给出任何错误。我使用bcp命令将数据从.csv文件加载到父表和子表中。

我可以看到外键约束已启用。

子表中使用的约束是:

ALTER TABLE [dbo].child WITH NOCHECK 
    ADD CONSTRAINT [FK_child_Parent] 
    FOREIGN KEY(company_id) REFERENCES [dbo].[Parent] (company_id)
GO

ALTER TABLE [dbo].child CHECK CONSTRAINT [FK_child_Parent]
GO
Run Code Online (Sandbox Code Playgroud)

当我插入一些记录时,SQL Server 会因违反外键而引发错误,这很好,但我很困惑为什么 SQL Server 在填充此数据时没有引发任何错误?

此外,我通过执行以下查询重新验证了现有记录的外键违规情况,并得到了预期的错误。

ALTER TABLE child
      WITH CHECK CHECK CONSTRAINT ALL
 GO
Run Code Online (Sandbox Code Playgroud)

Dav*_*idG 5

默认情况下,bcp 在插入数据时会忽略约束。如果您希望 bcp 遵守约束,则需要启用该功能。来自文档(强调我的):

CHECK_CONSTRAINTS:指定在批量导入操作期间必须检查目标表或视图上的所有约束。如果没有 CHECK_CONSTRAINTS 提示,任何 CHECK 和 FOREIGN KEY 约束都将被忽略,并且在操作之后,表上的约束将被标记为不可信。

因此,您运行的命令应如下所示:

bcp <current parameters> -h"CHECK_CONSTRAINTS"
Run Code Online (Sandbox Code Playgroud)