【问题标题】:I got error "The DELETE statement conflicted with the REFERENCE constraint"我收到错误“DELETE 语句与 REFERENCE 约束冲突”
【发布时间】:2011-04-16 03:09:40
【问题描述】:

我尝试用外键截断表并得到消息:

无法截断表,因为它被 FOREIGN KEY 约束引用”。

我阅读了很多关于这个问题的文献,并认为我通过删除找到了解决方案

DELETE FROM table_name DBCC CHECKIDENT (table_name, RESEED, 0)

但我仍然收到一条错误消息:

DELETE 语句与 REFERENCE 约束冲突”。

当我尝试使用 Microsoft Management Studio 删除并执行上一个查询时

DELETE FROM table_name DBCC CHECKIDENT (table_name, RESEED, 0)

它不会出错并且可以正常工作。我想从表中删除所有信息并向其中添加新信息,但我不想删除和创建外键。

【问题讨论】:

    标签: c# sql truncate sql-delete


    【解决方案1】:

    该错误意味着您在其他表中的数据引用了您尝试删除的数据。

    您需要删除并重新创建约束或删除外键引用的数据。

    假设您有以下表格

    dbo.Students
    (
    StudentId
    StudentName
    StudentTypeId
    )
    
    
    dbo.StudentTypes
    (
    StudentTypeId
    StudentType
    )
    

    假设在StudentTypesStudentTypeId 列和StudentsStudentTypeId 列之间存在外键约束

    如果您尝试删除StudentTypes 中的所有数据,则会出现错误,因为Students 中的StudentTypeId 列引用了StudentTypes 表中的数据。

    编辑:

    DELETETRUNCATE 本质上做同样的事情。唯一的区别是TRUNCATE 不会将更改保存到日志文件中。您也不能将WHERE 子句与TRUNCATE 一起使用

    至于为什么你可以在 SSMS 中运行它而不是通过你的应用程序。我真的看不到这种情况发生。无论事务来自何处,FK 约束仍然会引发错误。

    【讨论】:

    • 谢谢,我会尝试先删除“子”表,然后再删除主表。如果我使用 TRUNCATE 而不是 DELETE,它会起作用吗?你能告诉我为什么在 MS 管理工作室中我可以使用相同的查询从表中删除行,这在我使用应用程序尝试时给了我错误
    • 这远非“唯一的区别”,例如如果有任何引用,就不会发生截断。大多数系统上的事务中不会发生截断。并且截断不能作为存储过程的一部分发生。在大多数系统中,截断必须在单独的批处理中。并且 truncate 不能触发触发器。
    • @Jon Hanna - 当然,你是对的。我应该详细说明这些差异。也许用“唯一的区别”来表述会产生误导。
    • 在 SQL Server 中,您可以在存储过程中截断和/或作为事务的一部分进行截断。至少在 SSMS 2012 及更高版本中。
    【解决方案2】:

    您是否考虑过在相关的地方申请ON DELETE CASCADE

    【讨论】:

      【解决方案3】:

      您正在尝试删除被另一行(可能在另一个表中)引用的行。

      您需要先删除 行(或至少将其外键重新设置为其他内容),否则您最终会得到引用不存在行的行。数据库禁止这样做。

      【讨论】:

      • 我解决了我的问题,从“子”表中删除每一行,然后从“父”表中删除所有行。但仍有一些问题 :) 像“当我尝试使用 microsoft management studio 删除并执行上一个查询(例如 DELETE FROM table_name DBCC CHECKIDENT (table_name, RESEED, 0) )时,它没有给出错误工作正常。"
      【解决方案4】:

      要删除而不更改引用,您应该首先删除或以其他方式更改(以适合您的目的的方式)其他表中的所有相关行。

      要截断,您必须删除引用。 TRUNCATE 是 DDL 语句(类似于 CREATE 和 DROP)而不是 DML 语句(如 INSERT 和 DELETE),并且不会触发触发器,无论是显式的还是与引用和其他约束相关的触发器。因此,如果在具有引用的表上允许 TRUNCATE,则数据库可能会进入不一致的状态。当 TRUNCATE 是某些系统使用的标准的扩展时,这是一条规则,并且现在已被添加到标准中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-23
        • 1970-01-01
        • 1970-01-01
        • 2021-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多