我遇到了一个问题,有时是因为人际关系错误,一个关系将出现在数据库中,关系中没有真正的id。
SELECT relation_id
FROM relations
WHERE relation_id NOT
IN (
SELECT id
FROM relations
)
这将返回发生这种情况的字段,我想将relation_id的值切换为NULL。
这是我到目前为止所得到的:
UPDATE `relations` SET relation_id = NULL WHERE relation_id NOT IN (SELECT id FROM relations)
此课程适用于任何其他表格,仅适用于关系。有人知道解决方法吗?我确信有办法
答案 0 :(得分:3)
好吧,错误的原因实际上在错误消息本身中有详细描述...您无法在内部SELECT中指定更新的表。但是谁说我们不能更深入了?
UPDATE relations
SET relation_id = NULL
WHERE relation_id NOT IN (
SELECT id FROM (SELECT id FROM relations) AS take_that_sql
);
这是一个SQLFiddle。 )
答案 1 :(得分:1)
这就是我想要的:
UPDATE relations r
LEFT JOIN relations s
ON r.relation_id = s.id
SET r.relation_id = NULL
WHERE s.id IS NULL
AND r.relation_id IS NOT NULL;
(我不确定这是否会起作用;这可能引发异常,因为关系表被引用了两次。)
如果多表更新不起作用,我会创建一个工作表,用查询填充工作表(标识要更新的行),然后使用工作表运行多表更新。
此查询将识别relation_id
未指向现有id
的行:
SELECT r.*
FROM relations r
LEFT JOIN relations s
ON r.relation_id = s.id
WHERE s.id IS NULL
AND r.relation_id IS NOT NULL;
您不需要提取所有列,只需要提取主键。 (我假设主键是单列id
。)
CREATE TABLE work_table (id int PRIMARY KEY);
INSERT INTO work_table (id)
SELECT r.id
FROM relations r
LEFT JOIN relations s
ON r.relation_id = s.id
WHERE s.id IS NULL
AND r.relation_id IS NOT NULL;
UPDATE relations r
JOIN work_table s
ON r.id = s.id
SET r.relation_id = NULL;
DROP TABLE work_table;
附录:
如果您使用的是InnoDB,则可以通过定义外键约束来避免将来出现此类数据完整性问题。例如:
ALTER TABLE relations ADD CONSTRAINT relations_FK
FOREIGN KEY (relation_id) REFERENCES relations(id)
ON UPDATE CASCADE ON DELETE SET NULL;
这将禁止对表格进行更改,这会导致relation_id
的值不是表中存在的值id
。 (这要求id
是PRIMARY KEY,而relation_id具有相同的数据类型。)
答案 2 :(得分:0)
试试这个::
SELECT r1.relation_id
FROM relations r1
left join relations r2 on (r1.relation_id=r2.id)
where r2.id is null