我尝试用外键截断表并收到消息:
“无法截断表,因为它被外键约束引用”。
我阅读了很多有关该问题的文献,并认为我通过使用删除找到了解决方案
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)
它不会给出错误并且工作正常。我想删除表中的所有信息并向其中添加新信息,但我不想删除并创建外键。
该错误意味着您在其他表中的数据引用了您尝试删除的数据。
您需要删除并重新创建约束,或者删除外键引用的数据。
假设您有以下表格
dbo.Students
(
StudentId
StudentName
StudentTypeId
)
dbo.StudentTypes
(
StudentTypeId
StudentType
)
假设
StudentTypeId
中的 StudentTypes
列和 StudentTypeId
中的
Students
列之间存在外键约束
如果您尝试删除
StudentTypes
中的所有数据,则会出现错误,因为 StudentTypeId
中的 Students
列引用了 StudentTypes
表中的数据。
编辑:
DELETE
和 TRUNCATE
本质上做同样的事情。唯一的区别是 TRUNCATE
不会将更改保存到日志文件中。另外,您不能将 WHERE
子句与 TRUNCATE
一起使用
为什么你可以在 SSMS 中运行它,但不能通过你的应用程序运行。我真的看不到这种事发生。无论事务源自何处,FK 约束仍然会抛出错误。
您是否考虑过在相关的地方申请
ON DELETE CASCADE
?
您正在尝试删除另一行(可能在另一个表中)引用的行。
您需要先删除that行(或者至少将其外键重新设置为其他内容),否则您最终会得到引用不存在行的行。数据库禁止这样做。
要在不更改引用的情况下删除,您应该首先删除或以其他方式更改(以适合您的目的的方式)其他表中的所有相关行。
要截断,您必须删除引用。 TRUNCATE 是 DDL 语句(与 CREATE 和 DROP 相当),而不是 DML 语句(如 INSERT 和 DELETE),并且不会导致触发触发器(无论是显式触发器还是与引用和其他约束关联的触发器)。因此,如果在带有引用的表上允许 TRUNCATE,数据库可能会进入不一致状态。当 TRUNCATE 是某些系统使用的标准的扩展时,这是一条规则,并且由标准强制执行,现在它已被添加。
在 SQL 服务器中 转到数据库图表并选择关系属性 转到插入和更新规格列 将删除规则设置为空
对于 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;