MySQL删除具有引用不存在ID的参数的行

Posted

技术标签:

【中文标题】MySQL删除具有引用不存在ID的参数的行【英文标题】:MySQL delete rows that have parameter which refers to the not exist ID 【发布时间】:2017-10-05 12:43:12 【问题描述】:

我需要从表中删除所有具有“for_id”参数的记录指的是该表中不存在的“id”。

In this example,我需要删除带有name =“tom”的行,因为带有id = 3 的条目不存在。

谢谢!

【问题讨论】:

编辑您的帖子并将您使用的数据库添加到标签中。 【参考方案1】:

所以你想removefor_idid 中执行not exist 的那些记录 换句话说,keepfor_idid 中为exists 执行的那些记录

SELECT * FROM table_name 
where for_id in (select id from table_name)

或使用join:

SELECT t1.* FROM 
table_name t1 join table_name t2
on t1.for_id=t2.id

输出:

| id | for_id | lvl | name |
|----|--------|-----|------|
|  4 |      1 |   1 |  joe |
|  5 |      1 |   1 | mack |
|  6 |      5 |   2 | bill |
|  7 |      5 |   2 |  rex |
|  8 |      7 |   3 |  ted |

【讨论】:

不!我需要删除所有具有“for_id”参数的记录是指该表中不存在的“id”。 好的所以你想KEEP所有的记录都有“for_id”参数,它引用了这个表中exists的“id”?如果是,请检查更新的解决方案。【参考方案2】:
DELETE D.* FROM table_name D
  LEFT JOIN table_name T
    ON T.ID=D.FOR_ID
 WHERE T.ID IS NULL and D.FOR_ID<>0;

在sqlfiddle.com上测试

【讨论】:

你真是个天才!非常感谢!!【参考方案3】:

如果你也想删除那些 for_id=0 的,那么你可以使用:

DELETE 
FROM table_name as t1
where not exists (select id 
       from table_name as t2 
       where t2.id=t1.for_id) 

如果您不想删除具有 for_id=0 的那些,您可以使用:

delete 
FROM table_name as t1
where not exists (select id 
       from table_name as t2 
       where t2.id=t1.for_id) and t1.for_id<>0

【讨论】:

未捕获异常 'PDOException' 并带有消息 'SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 mysql 服务器版本相对应的手册,以获取正确的语法,以便在 'as t1 where not exists (select id from categories as t2 where t2.id=t1.for_id) a' at line 1' 附近使用,如果我尝试执行 2 -nd 脚本。 尝试将您的字段和表名封装在反引号 (`) 中,以便将查询与 PDO 一起使用 对不起,但我知道。我尝试了许多 $del_sub_cat=$dbh->query("DELETE FROM categories as t1 where not exist (select id from categories as t2 where t2.id=t1.for_id) 和 t1.for_id 0");未捕获的异常“PDOException”,带有消息“SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在 'as t1 where not exists (select id from categories as t2 where t2.id=t1.for_i' at line 1') 附近使用>

以上是关于MySQL删除具有引用不存在ID的参数的行的主要内容,如果未能解决你的问题,请参考以下文章

删除数据框中引用另一个 (R) 中不存在的 ID 的行?

如何确保两行不具有相同的值[重复]

SQL删除存在值的行和具有该值的后续列

如果表中的行不存在,我如何更新或插入它?

计算联接表中的行,但如果不存在行则显示 0 - mysql

MySQL学习笔记11复制错误处理删除不存在的行的问题