我在mysql中有2个表。
当某些内容被插入table1时,它也被插入到table2中。这样,两个表的id列中的自动增量始终是对齐的。
然后我从table1中删除了许多符合某个条件的行,但没有删除table2中的任何行。我现在想从表2中删除我从table1中删除的所有行。
所以基本上,我想要从Table2中删除table1中不存在id的所有行...并保留table1和table2中都存在id列的行...
如何尽可能干净简洁地完成这项工作?
我可以使用php或mysql / phpmyadmin ...
答案 0 :(得分:8)
当某些内容被插入table1时,它也被插入到table2中。这样,两个表的id列中的自动增量始终是对齐的。
请不要那样做。自动增量不是依赖于保持值同步的东西。您应该执行以下操作:
我热烈建议你尽快重构,否则将来会有成千上万的类似问题。
(将此作为答案发布,因为任何具有相同OP问题的人都可能是同一架构错误的受害者。)
答案 1 :(得分:3)
如果两个表相关,那么最好使用CASCADE DELETE
否则
Delete
FROM table2
WHERE ID not in (select t1.ID from table1 t1);
答案 2 :(得分:2)
您可以使用联接删除,但先进行备份
DELETE table2 FROM table2 LEFT JOIN table1
ON table2.id=table1.id
WHERE table1.id IS NULL;
答案 3 :(得分:1)
同时删除两个表中的记录:
DELETE `table1`, `table2`
FROM `table1`
LEFT OUTER JOIN `table2` ON `table1`.`id` = `table2`.`id`
WHERE @condition
这样您就不需要将每个表的查询发送到数据库。
答案 4 :(得分:0)
这是最紧凑的解决方案:
delete table2 from table2 left join table1
using (id)
where table1.id is null
编辑:不仅仅是紧凑型。紧凑而高效。子查询解决方案将像饥饿的老虎一样吃掉你的CPU时间。
答案 5 :(得分:0)
$result = mysql_query(SELECT ID FROM table2 WHERE table2.ID NOT IN ( SELECT table1.ID FROM table1 WHERE table2.ID=table1.ID ));
$rows = mysql_num_rows($result);
$i = 0;
while($i < $rows){
$cleanup = mysql_query(DELETE from table2 WHERE ID='$result[$i] ));
}