我在表格中有一行。此行具有在具有数百万行的其他几个表中引用的ID列。删除行的SQL语句总是超时。从我的设计中,我知道我想删除的行永远不会被引用到任何其他地方。因此,我希望SQL忽略必须检查所有其他表以获取对该行的外键引用并立即删除该行。在SQL 2008中有一种快速的方法吗? 也许有些事情如下:
DELETE FROM myTable where myTable.ID = 6850 IGNORE CONSTRAINTS
或类似的东西。
答案 0 :(得分:47)
您可以将该表/列上的约束设置为不临时检查,然后重新启用约束。一般形式是:
ALTER TABLE TableName NOCHECK CONSTRAINT ConstraintName
然后使用
重新启用所有约束ALTER TABLE TableName CHECK CONSTRAINT ConstraintName
我认为这是暂时的?你显然不希望这样做。
答案 1 :(得分:23)
是的,只需运行
DELETE FROM myTable where myTable.ID = 6850
并让发动机验证制约因素。
如果您想要'聪明'并禁用约束,那么您将付出巨大的代价:启用约束必须验证每一行而不是您刚删除的那一行。有一些内部标志,SQL保持知道约束是否“可信”。你''优化'会导致将这些标志更改为'false'(意味着SQL不再信任约束),或者它必须从头开始重新验证它们。
请参阅Guidelines for Disabling Indexes and Constraints和Non-trusted constraints and performance。
除非你做了一些实体测量,证明DELETE操作的约束验证是性能瓶颈,否则让引擎继续工作。
答案 2 :(得分:6)
在任何情况下都不要禁用约束。这是一个非常愚蠢的做法。如果您执行此类操作,则无法保持数据完整性。数据完整性是数据库的首要考虑因素,因为没有它,你什么都没有。
正确的方法是在尝试删除父记录之前从子表中删除。你可能已经超时,因为你已经设置了级联的deltes,这是大型数据库中的另一个不好的做法。
答案 3 :(得分:3)
我知道这是一个旧线程,但是当我的行删除被外键约束阻止时,我就到了这里。在我的例子中,我的表设计允许约束列中的“NULL”值。在要删除的行中,我将约束列值更改为“NULL”(不违反外键约束),然后删除所有行。
答案 4 :(得分:2)
我想删除两个表中的所有记录,因为它是所有测试数据。我使用 SSMS GUI 暂时禁用FK约束,然后在两个表上运行DELETE查询,最后我重新启用了FK约束。
禁用FK约束:
[1]'窗格,可以通过'查看'菜单选项,或键F8
[2]如果你不确定哪个表是从属表,你可以通过右键单击相关表格并选择“查看依赖关系”来检查。选项。
答案 5 :(得分:2)
您可以通过以下代码行禁用数据库中的所有内容:
EXEC sp_MSforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
,并在运行update / delete命令之后,可以按以下方式再次启用它:
EXEC sp_MSforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
答案 6 :(得分:1)
在所有外键指向此表的表上,使用:
ALTER TABLE MyOtherTable NOCHECK CONSTRAINT fk_name
答案 7 :(得分:0)
您可以禁用并重新启用约束:
http://sqlforums.windowsitpro.com/web/forum/messageview.aspx?catid=60&threadid=48410&enterthread=y
答案 8 :(得分:0)
SET FOREIGN_KEY_CHECKS = 0;
/ *运行您的脚本* /
SET FOREIGN_KEY_CHECKS = 1;
看看这是否有帮助,这是为了忽略foreign key
检查。
但删除禁用此功能是非常糟糕的做法。
答案 9 :(得分:0)
仅出于测试目的,我在 MySQL 中使用以下命令从具有外键引用的表中仅删除一条记录。
SET FOREIGN_KEY_CHECKS = 0; -- Disabling foreign key checks before running the following query.
DELETE FROM table_name WHERE id = id_to_delete; -- Deleting a record from a table that has foreign key reference.
SET FOREIGN_KEY_CHECKS = 1; -- Enabling foreign key checks after running the above query.
答案 10 :(得分:-1)
暂时禁用表T-SQL,SQL Server上的约束
ALTER TABLE TableName NOCHECK CONSTRAINT ALL
ALTER TABLE TableName CHECK CONSTRAINT ALL
ALTER TABLE TableName NOCHECK CONSTRAINT FK_Table_RefTable
ALTER TABLE TableName CHECK CONSTRAINT FK_Table_RefTable
DELETE FROM TableName
DBCC CHECKIDENT ('TableName', RESEED, 0)
SET FOREIGN_KEY_CHECKS = 0; -- Disable foreign key checking.
TRUNCATE TABLE [YOUR TABLE];
SET FOREIGN_KEY_CHECKS = 1;