Mac*_*iej 202 sql sql-server entity-relationship sql-server-2005 constraints
我正在寻找一种暂时关闭所有数据库约束(例如表关系)的方法.
我需要将一个DB的表复制(使用INSERT)到另一个DB.我知道我可以通过以正确的顺序执行命令(不破坏关系)来实现这一点.
但是如果我可以暂时关闭检查约束并在操作完成后重新打开它会更容易.
这可能吗?
Don*_*nal 217
-- Disable the constraints on a table called tableName:
ALTER TABLE tableName NOCHECK CONSTRAINT ALL
-- Re-enable the constraints on a table called tableName:
ALTER TABLE tableName WITH CHECK CHECK CONSTRAINT ALL
---------------------------------------------------------
-- Disable constraints for all tables:
EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'
-- Re-enable constraints for all tables:
EXEC sp_msforeachtable 'ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all'
---------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
gbn*_*gbn 212
您只能在SQL 2005+中禁用FK和CHECK约束.请参见ALTER TABLE
ALTER TABLE foo NOCHECK CONSTRAINT ALL
Run Code Online (Sandbox Code Playgroud)
要么
ALTER TABLE foo NOCHECK CONSTRAINT CK_foo_column
Run Code Online (Sandbox Code Playgroud)
无法禁用主键和唯一约束,但如果我理解正确,这应该没问题.
Mic*_*ell 57
并且,如果你想验证你没有破坏你的关系并引入孤儿,一旦你重新装备你的支票,即
ALTER TABLE foo CHECK CONSTRAINT ALL
Run Code Online (Sandbox Code Playgroud)
要么
ALTER TABLE foo CHECK CONSTRAINT FK_something
Run Code Online (Sandbox Code Playgroud)
然后你可以重新运行并对任何选中的列进行更新,如下所示:
UPDATE myUpdatedTable SET someCol = someCol, fkCol = fkCol, etc = etc
Run Code Online (Sandbox Code Playgroud)
此时的任何错误都将归因于未能满足约束条件.
kri*_*tof 16
实际上,您可以在单个SQL命令中禁用所有数据库约束,并重新启用它们调用另一个命令.看到:
我目前正在使用SQL Server 2005,但我几乎可以肯定这种方法也适用于SQL 2000