Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
同一表上的MySQL外键_Mysql - Fatal编程技术网

同一表上的MySQL外键

同一表上的MySQL外键,mysql,Mysql,我有一个存储评论的表。每个评论都有自己的ID和一个isReply列,以防该评论是对另一个评论的回复。我想知道我是否可以设置一个关系,这样当一条评论被删除时,所有回复该评论的评论都会被自动删除。我尝试将外键设置为引用comments.id的isReply列,但出现以下错误: 1452-无法添加或更新子行:外键约束失败(\u db\sql-1030\u 31f,约束\sql-1030\u 31f\u ibfk 1 外键(isReply)引用删除级联上的注释(id) 更新时(无操作) 创建一个触发器以

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

1452-无法添加或更新子行:外键约束失败(
\u db
\sql-1030\u 31f
,约束
\sql-1030\u 31f\u ibfk 1
外键(
isReply
)引用删除级联上的
注释(
id
) 更新时(无操作)


创建一个触发器以删除具有相同条件的所有记录。删除注释表中的记录时

看看


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

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

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

注意您可能希望使用以下方法将
isReply
的默认值设置为
null

ALTER TABLE comments CHANGE isReply isReply integer DEFAULT NULL;

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


有关更多信息,请参阅:它解释了失败的原因、如何查找失败记录以及如何规避问题。

但如果我创建了触发器,在导出和导入整个数据库时触发器是否仍然存在:/n如果您关联删除注释查询以删除回复,则将从数据库中删除它们,因此不可能导出,如果您想将它们存储在数据库中,请尝试在表中添加布尔字段“isDeleted”,并将其值从false更改为True您能否制作一个显示上述错误的简化SQLFIDLE?顺便说一句,不要忘记这个限制:另一方面,删除集NULL上的自引用是可能的,就像删除级联上的自引用一样。级联操作的嵌套深度不能超过15级。
从注释c1中删除c1左连接c2上的注释c2.id=c1.isReply,其中c2.id为NULL
。这将删除对已删除评论的所有回复。然后添加一个FK就可以了。除了删除一个,您还可以选择
更新。。。左连接。。。在…上设置c1.isReply=NULL,其中…
。您已经了解了一些情况。我清空了整个表并成功地添加了键,但是当我现在尝试添加一条记录时,我得到
无法添加或更新子行:外键约束失败(
\u db
,constraint
comments\u ibfk\u 1`外键(
isReply
)引用
注释
id
)在DELETE CASCADE ON UPDATE NO ACTION)`@php\u nub\u qq上,你应该先添加评论,然后添加答案。反过来也不行。尝试插入一条注释,然后插入一个答案。使用表中的选项进行调试,以确保引用的父级存在。我插入的是注释,而不是对注释的答复。这是奇怪还是什么?@php\u nub\u qq啊,当然,你也应该在FK列(
isReply
)上允许
null
)。正如@edsioufi和@biziclop指出的那样。默认情况下,
isReply
应为空。另外,我建议您也将更新时的
设置为
CASCADE