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很乐意帮忙:)这种技术叫做“自连接”。这是一个很好的教程:该技术是基于某些条件实现表“自我更新”的最简单方法之一。