MySQL-选择,不存在问题

MySQL-选择,不存在问题,mysql,select,phpmyadmin,Mysql,Select,Phpmyadmin,我有一个问题,有时由于人为错误,一个关系id会出现在关系数据库中,并且没有真正的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 relatio

我有一个问题,有时由于人为错误,一个关系id会出现在关系数据库中,并且没有真正的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)
这不适用于任何其他表,但不适用于关系。有人知道附近有工作吗?我相信有一种方法可以尝试一下:

SELECT r1.relation_id
FROM relations r1
left join relations r2 on (r1.relation_id=r2.id)
where r2.id is null
试试这个:

SELECT r1.relation_id
FROM relations r1
left join relations r2 on (r1.relation_id=r2.id)
where r2.id is null

这就是我要尝试的:

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;
我不确定这是否有效;这可能会引发异常,因为关系表被引用了两次

如果多表更新不起作用,我将创建一个工作表,用标识要更新的行的查询填充工作表,然后使用工作表运行多表更新

此查询将标识具有不指向现有id的关系id的行:

您不需要提取所有列,只需提取主键。这里我假设主键是单列id

增编:

如果您使用的是InnoDB,您可以通过定义外键约束来避免将来出现这种类型的数据完整性问题。例如:

ALTER TABLE relations ADD CONSTRAINT relations_FK
FOREIGN KEY (relation_id) REFERENCES relations(id)
ON UPDATE CASCADE ON DELETE SET NULL;

这将禁止对表进行更改,这将导致关系id的值不是表中存在的id值。这要求id是主键,并且关系id具有相同的数据类型。

这就是我要尝试的:

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;
我不确定这是否有效;这可能会引发异常,因为关系表被引用了两次

如果多表更新不起作用,我将创建一个工作表,用标识要更新的行的查询填充工作表,然后使用工作表运行多表更新

此查询将标识具有不指向现有id的关系id的行:

您不需要提取所有列,只需提取主键。这里我假设主键是单列id

增编:

如果您使用的是InnoDB,您可以通过定义外键约束来避免将来出现这种类型的数据完整性问题。例如:

ALTER TABLE relations ADD CONSTRAINT relations_FK
FOREIGN KEY (relation_id) REFERENCES relations(id)
ON UPDATE CASCADE ON DELETE SET NULL;

这将禁止对表进行更改,这将导致关系id的值不是表中存在的id值。这要求id是主键,并且关系id具有相同的数据类型。

好吧,错误消息本身实际上很好地描述了错误的原因。。。不能在内部选择中指定要更新的表。但谁说我们不能深入呢

UPDATE relations 
   SET relation_id = NULL 
 WHERE relation_id NOT IN (
       SELECT id FROM (SELECT id FROM relations) AS take_that_sql
);

这是一个可以玩的游戏

嗯,错误的原因实际上在错误消息本身中得到了很好的描述。。。不能在内部选择中指定要更新的表。但谁说我们不能深入呢

UPDATE relations 
   SET relation_id = NULL 
 WHERE relation_id NOT IN (
       SELECT id FROM (SELECT id FROM relations) AS take_that_sql
);

这是一个可以玩的游戏

您确定可以使用子查询对表本身进行UD更新吗?MySQL说:1093-您不能指定目标表“关系”以便从子句中进行更新。您可以通过表单或myPhpAdmin手动输入关系id吗?通常这些都是自动编号,所以你不应该触摸它们。你确定你可以使用子查询来更新一个表吗?MySQL说:1093-你不能指定目标表的“关系”以便从子句中更新。你可以通过表单或myPhpAdmin手动输入关系id吗?通常这些都是自动编号,所以你不应该触摸它们。你可以创建一个临时表,然后加入并这样做。。。因为它是一个mysql约束,所以不允许您进行更新。您可以创建一个临时表,然后加入并执行此操作。。。因为它是mysql约束,所以不允许更新。