2表什么删除?

时间:2011-04-04 10:09:31

标签: php mysql

我在mysql中有2个表。

当某些内容被插入table1时,它也被插入到table2中。这样,两个表的id列中的自动增量始终是对齐的。

然后我从table1中删除了许多符合某个条件的行,但没有删除table2中的任何行。我现在想从表2中删除我从table1中删除的所有行。

所以基本上,我想要从Table2中删除table1中不存在id的所有行...并保留table1和table2中都存在id列的行...

如何尽可能干净简洁地完成这项工作?

我可以使用php或mysql / phpmyadmin ...

6 个答案:

答案 0 :(得分:8)

  

当某些内容被插入table1时,它也被插入到table2中。这样,两个表的id列中的自动增量始终是对齐的。

请不要那样做。自动增量不是依赖于保持值同步的东西。您应该执行以下操作:

  1. 使用auto_increment;
  2. 在表1中插入数据
  3. 获取最后插入行的ID;
  4. 在表2中插入数据,不带auto_increment,id = table1.id
  5. 我热烈建议你尽快重构,否则将来会有成千上万的类似问题。

    (将此作为答案发布,因为任何具有相同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] ));
}