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)
默认情况下,bcp 在插入数据时会忽略约束。如果您希望 bcp 遵守约束,则需要启用该功能。来自文档(强调我的):
CHECK_CONSTRAINTS:指定在批量导入操作期间必须检查目标表或视图上的所有约束。如果没有 CHECK_CONSTRAINTS 提示,任何 CHECK 和 FOREIGN KEY 约束都将被忽略,并且在操作之后,表上的约束将被标记为不可信。
因此,您运行的命令应如下所示:
bcp <current parameters> -h"CHECK_CONSTRAINTS"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
779 次 |
| 最近记录: |