当引用的父级不在同一个表中时,mysql update字段为null

q5iwbnjs  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(245)

我需要写一个棘手的查询,经过大量的研究,我找不到一个解决方案,符合我的情况。
我正在处理一个现有的数据库,在那里我需要引用可以有子委员会的委员会,因此委员会表如下所示:

+----+--------------------+------------------+
| id | name               | parent_id        |
+----+--------------------+------------------+
|  1 | comm1              | NULL             |
|  2 | comm2              | 1                |
|  3 | comm3              | 1                |
|  4 | comm4              | 5                |
+----+--------------------+------------------+

我需要添加一个fk,以便parent\u 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。
有没有一个可行的解决方案来实现这一点?提前谢谢你的帮助

1yjd4xko

1yjd4xko1#

你可以利用 Left Join 取而代之的是:

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_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

相关问题