我收到错误“DELETE 语句与 REFERENCE 约束冲突”

问题描述 投票:0回答:6

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

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

我阅读了很多有关该问题的文献,并认为我通过使用删除找到了解决方案

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
6个回答
59
投票

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

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

假设您有以下表格

dbo.Students
(
StudentId
StudentName
StudentTypeId
)


dbo.StudentTypes
(
StudentTypeId
StudentType
)

假设

StudentTypeId
中的
StudentTypes
列和
StudentTypeId
 中的 
Students

列之间存在外键约束

如果您尝试删除

StudentTypes
中的所有数据,则会出现错误,因为
StudentTypeId
中的
Students
列引用了
StudentTypes
表中的数据。

编辑:

DELETE
TRUNCATE
本质上做同样的事情。唯一的区别是
TRUNCATE
不会将更改保存到日志文件中。另外,您不能将
WHERE
子句与
TRUNCATE

一起使用

为什么你可以在 SSMS 中运行它,但不能通过你的应用程序运行。我真的看不到这种事发生。无论事务源自何处,FK 约束仍然会抛出错误。


20
投票

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

ON DELETE CASCADE


12
投票

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

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


2
投票

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

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


1
投票

在 SQL 服务器中 转到数据库图表并选择关系属性 转到插入和更新规格列 将删除规则设置为空


0
投票

对于 SQL Server 你可以这样做

ALTER TABLE <table> NOCHECK CONSTRAINT <constraint>

对于MySQL

SET foreign_key_checks = 0

对于 Oracle/PLSQL

ALTER TABLE table_name DISABLE CONSTRAINT constraint_name

对于 PostgreSQL

ALTER TABLE schema.my_table DISABLE TRIGGER ALL;

https://dba.stackexchange.com/questions/331426/how-to-disable-foreign-key-referential-integrity-trigger-in-postgresql-without-d

© www.soinside.com 2019 - 2024. All rights reserved.