Mysql 当引用的父项不为';t存在于同一个表中

Mysql 当引用的父项不为';t存在于同一个表中,mysql,Mysql,我需要写一个棘手的查询,经过大量的研究,我找不到一个适合我的情况的解决方案 我正在处理一个现有的数据库,在那里我需要参考可以有小组委员会的委员会,因此委员会表如下所示: +----+--------------------+------------------+ | id | name | parent_id | +----+--------------------+------------------+ | 1 | comm1

我需要写一个棘手的查询,经过大量的研究,我找不到一个适合我的情况的解决方案

我正在处理一个现有的数据库,在那里我需要参考可以有小组委员会的委员会,因此委员会表如下所示:

+----+--------------------+------------------+
| id | name               | parent_id        |
+----+--------------------+------------------+
|  1 | comm1              | NULL             |
|  2 | comm2              | 1                |
|  3 | comm3              | 1                |
|  4 | comm4              | 5                |
+----+--------------------+------------------+
我需要添加一个FK,以便parent_id字段引用实际父对象的id字段

ALTER TABLE committee
ADD CONSTRAINT fk_parent_id 
FOREIGN KEY (parent_id )
REFERENCES committee(id);
但这失败了(无法添加或更新子行:外键约束失败),因为数据中的某个父id字段引用委员会已被删除

因此,为了能够添加此约束,我想将引用不存在的委员会作为父委员会的委员会的parent_id字段设置为NULL。我想做一些类似的事情:

UPDATE committee c1
SET c1.parent_id = NULL
WHERE NOT EXISTS
        (
        SELECT * 
        FROM committee c2
        WHERE c2.id = c1.parent_id
        );
但很明显,这不起作用,因为我不能在子查询中引用c1

是否有可行的解决方案来实现这一目标?提前感谢您的帮助

您可以使用
左加入
进行“自加入”:

UPDATE committee AS c1
LEFT JOIN committee AS c2 ON c2.id = c1.parent_id 
SET c1.parent_id = NULL
WHERE c2.id IS NULL 
我们可以通过不考虑那些行来进一步优化这一点,
parent\u id
已经是
null

UPDATE committee AS c1
LEFT JOIN committee AS c2 ON c2.id = c1.parent_id 
SET c1.parent_id = NULL
WHERE c2.id IS NULL AND 
      c1.parent_id IS NOT NULL 

非常感谢,它工作得非常好。我不知道记录的存在可以通过这种方式检查,在JOIN@G.Serneels很乐意帮忙:)这种技术叫做“自连接”。这是一个很好的教程:该技术是基于某些条件实现表“自我更新”的最简单方法之一。