从表中删除另一个表中不存在的所有记录

时间:2010-11-04 10:22:46

标签: mysql

我有一张包含很多(> 20.000)记录的表格。 现在是时候清理那些因为查询开始占用大量资源了。 我有另一个(临时)表格,其中包含最近记录。第一个表中第二个中不存在的所有记录都可以。 但是,由于一些连接,我需要保留最近记录的id,所以我不能只是TRUNCATE然后复制表。 你有什么办法吗?

2 个答案:

答案 0 :(得分:14)

DELETE FROM old_table WHERE id NOT IN (SELECT id FROM temp_table)

修改
id NOT IN (SELECT id FROM temp_table)是一个糟糕的建筑。如果你有大表并且你的服务器设置被调到低内存,你将永远执行它。

@Piskvor的答案是一个更长的,但更好的查询,这将在低内存设置上发挥最佳作用。当我说“低内存”时,我指的是不占用完整高端计算机的数据库服务器,所以几乎所有管理小型企业网站的系统都是这样的。

答案 1 :(得分:4)

这将为您提供id行中没有相应行(由recordid列匹配 - 您的可能不同的行)在另一个表中:

SELECT t1.id 
    FROM firsttable t1
    LEFT JOIN secondtable t2
WHERE t1.recordid = t2.recordid
    AND t2.id IS NULL

这使您可以检查是否确实选择了要删除的正确行。然后,将其插入DELETE:

DELETE FROM firsttable WHERE firsttable.id IN (
    SELECT t1.id 
        FROM firsttable t1
        LEFT JOIN secondtable t2
    WHERE t1.recordid = t2.recordid
        AND t2.id IS NULL
)