在SQL Server中批量更新时禁用约束条件

问题描述:

我需要更改2个表上PK/FK(添加10000)的值。我如何告诉涉及到的两个表格,他们不应该在更新期间关心参照完整性,而是关心后续处理。如果我不需要,我不想丢弃和重新创建关系。在SQL Server中批量更新时禁用约束条件

你的FK应该有一个“ON UPDATE CASCADE”选项。

ALTER TABLE child CHANGE myfkconst FOREIGN KEY id REFERENCES parent (id) ON UPDATE CASCADE; 

(或类似的东西。不是100%肯定有关语法)

然后你可以做

UPDATE parent SET id = id + 10000 WHERE id = something 

与子表将自动更新。

对不起,您必须。没有选择。

您可能需要通过执行以下命令来关闭数据库中的所有约束:

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"; 

然后与切换回:

EXEC sp_msforeachtable @command1="print '?'", 
         @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"; 

来源:Stack Overflow - Can foreign key constraints be temporarily disabled using TSQL?

+0

这是否也允许IDENTITY列值被更改? – Codesleuth 2010-01-15 16:21:45

+0

这可能有点复杂。您可以检查身份相关信息:http://www.mssqltips.com/tip.asp?tip=1397 – 2010-01-15 17:03:29

This link介绍如何暂时禁用一个约束。我没有测试过它。

-- disable constraint 
ALTER TABLE table_name NOCHECK CONSTRAINT constraint_name 
-- enable constraint 
ALTER TABLE table_name CHECK CONSTRAINT constraint_name 
+1

您需要注意,使用此方法时,如果您重新打开约束,数据库将执行数据完整性检查。如果出现错误,您的数据可能会失败,修复它可能会产生问题。这也在这里解释:http://*.com/questions/159038/can-foreign-key-constraints-be-temporarily-disabled-using-tsql/159064#159064。 – 2010-01-15 16:44:08

+0

是的,这是真的,但这似乎是一个简单的情况,OP只需要将每个值更新10000,所以这应该不成问题。似乎唯一的答案是不会有这个问题会改变外键为'ON UPDATE CASCADE',这将改变外键而不是仅仅禁用它(这可能是正常的)。 – rosscj2533 2010-01-15 16:52:39