我想批量插入大量具有循环依赖关系的生成数据(每个表中的列是约束到另一个表的外键)。为了解决这个问题,我想关闭外键约束,插入数据,然后重新打开约束。
谷歌搜索后,我找到了很多解决方案,但没有一个有效。现在我有:
ALTER TABLE TableName NOCHECK CONSTRAINT ALL
该命令运行并且不会产生任何错误,但是当我尝试清除表以准备插入数据时,出现以下错误:
System.Data:0:in `OnError': The DELETE statement conflicted with the REFERENCE constraint "FK_1_2_ConstraintName". The conflict occurred in database "DatabaseName", table "dbo.SomeOtherTable", column 'PrimaryKey'.\r\nThe statement has been terminated.\r\nChecking identity information: current identity value '0', current column value '0'.\r\nDBCC execution completed. If DBCC printed error messages, contact your system administrator. (System::Data::SqlClient::SqlException)
我目前的理论是,这是由另一个表上的外键约束引起的,该约束取决于正在更改的表。
对于这个问题我可以想出两种解决方案:
遍历所有与我插入的表有依赖关系的表并禁用它们的外键约束。这似乎不必要地复杂。
禁用数据库中所有表的外键约束。
这两种解决方案都可以,但我不确定从哪里开始使用这两种解决方案。有什么想法吗?
最佳答案
这就是我用于此类工作的工具。
--Disable all Constraints
exec sp_MSforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
-- INSERT DATA HERE
--Enable all Constraints
exec sp_MSforeachtable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
关于sql - 批量插入时忽略外键约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6497675/