MySQL - 选择,不是问题

时间:2012-06-21 14:55:25

标签: mysql select phpmyadmin

我遇到了一个问题,有时是因为人际关系错误,一个关系将出现在数据库中,关系中没有真正的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)

此课程适用于任何其他表格,仅适用于关系。有人知道解决方法吗?我确信有办法

3 个答案:

答案 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