删除忽略所有外键和约束的SQL行

时间:2009-12-07 21:34:53

标签: sql-server sql-server-2008

我在表格中有一行。此行具有在具有数百万行的其他几个表中引用的ID列。删除行的SQL语句总是超时。从我的设计中,我知道我想删除的行永远不会被引用到任何其他地方。因此,我希望SQL忽略必须检查所有其他表以获取对该行的外键引用并立即删除该行。在SQL 2008中有一种快速的方法吗? 也许有些事情如下:

DELETE FROM myTable where myTable.ID = 6850 IGNORE CONSTRAINTS

或类似的东西。

11 个答案:

答案 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 ConstraintsNon-trusted constraints and performance

除非你做了一些实体测量,证明DELETE操作的约束验证是性能瓶颈,否则让引擎继续工作。

答案 2 :(得分:6)

在任何情况下都不要禁用约束。这是一个非常愚蠢的做法。如果您执行此类操作,则无法保持数据完整性。数据完整性是数据库的首要考虑因素,因为没有它,你什么都没有。

正确的方法是在尝试删除父记录之前从子表中删除。你可能已经超时,因为你已经设置了级联的deltes,这是大型数据库中的另一个不好的做法。

答案 3 :(得分:3)

我知道这是一个旧线程,但是当我的行删除被外键约束阻止时,我就到了这里。在我的例子中,我的表设计允许约束列中的“NULL”值。在要删除的行中,我将约束列值更改为“NULL”(不违反外键约束),然后删除所有行。

答案 4 :(得分:2)

我想删除两个表中的所有记录,因为它是所有测试数据。我使用 SSMS GUI 暂时禁用FK约束,然后在两个表上运行DELETE查询,最后我重新启用了FK约束。

禁用FK约束:

  1. 展开数据库对象[1]
  2. 展开从属表对象[2]
  3. 扩展' Keys'夹
  4. 右键单击外键
  5. 选择修改'选项
  6. 更改“强制外键约束”'选项'否'
  7. 关闭'外键关系'窗口
  8. 关闭表设计器标签
  9. 提示时确认保存更改
  10. 运行必要的删除查询
  11. 重新启用外键约束,方法与禁用它一样。
  12. '对象浏览器中的

    [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)

答案 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上的约束

MSSQL

  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

ref

  DELETE FROM TableName
  
  DBCC CHECKIDENT ('TableName', RESEED, 0)

MySql

  SET FOREIGN_KEY_CHECKS = 0; -- Disable foreign key checking. 

  TRUNCATE TABLE [YOUR TABLE]; 

  SET FOREIGN_KEY_CHECKS = 1;