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】:所以你想remove
for_id
在id
中执行not exist
的那些记录
换句话说,keep
for_id
在id
中为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 FROMcategories
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的参数的行的主要内容,如果未能解决你的问题,请参考以下文章