12

我有这张表来存储评论。每条评论都有自己的 ID 和一isReply列,以防评论是对另一条评论的回复。我想知道是否可以设置关系,以便在删除评论时自动删除所有回复该评论的评论。我尝试为isReply列引用设置外键,comments.id但出现此错误:

#1452 - 无法添加或更新子行:外键约束失败(_db. #sql-1030_31f, CONSTRAINT #sql-1030_31f_ibfk_1 FOREIGN KEY ( isReply) REFERENCES comments( id) ON DELETE CASCADE ON UPDATE NO ACTION)

4

3 回答 3

10

您的评论表可能仍然包含isReply引用在测试期间已删除的评论的值的答案。听听 MySQL 想说什么:

a foreign key constraint fails

您所要做的就是清空表,定义外键(您的错误应该消失),然后您将拥有所需的行为。一旦创建了 FK,就不需要触发器,这就是级联存在的原因。

请注意,您可能希望将默认值设置为isReply使用null

ALTER TABLE comments CHANGE isReply isReply integer DEFAULT NULL;
于 2013-08-25T17:04:01.123 回答
10

实际上,同一张表中的外键完全有效的。1452 仅表示您有一个或多个项目引用了一个不存在(不再存在)的项目,因此外键的定义是无效的。

有关更多信息,请参阅:Mysql 错误 1452 - 无法添加或更新子行:外键约束失败它解释了失败的原因、如何找到失败的记录以及如何规避问题。

于 2013-08-25T17:04:26.053 回答
-1

创建触发器以删除具有相同条件的所有记录。当评论表中的记录被删除时。

检查触发器文档

看看这个问题

否则,您不能使用与外键在同一个表中的列。

于 2013-08-25T16:54:57.157 回答