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

8

我有一张有很多记录(>20.000)的表格。现在是时候对其进行清理了,因为查询开始占用了大量资源。我有另外一张(临时)表格,其中包含最近的记录。第一张表格中所有不存在于第二张表格中的记录都可以删除。但是,由于某些联接需要,我需要保留最近记录的ID,所以不能只是TRUNCATE然后复制表格。是否有任何方法可以做到这一点?


你能再说明一下吗?你想要从“最近记录”中删除条目,还是从更大的表格中删除? - Kalle
1
请注意,对于数据库来说,2万行实际上是一个表。如果您在那里遇到性能问题,您可能希望进行分析并查看相关表的索引。 - Piskvor left the building
嗨,这是针对ZenCart网店的内容,每次加载网站时它都会尝试执行很多SELECT操作。 - Tim van Dalen
我想从大表中删除条目。最近的表实际上是一个数据源,我可以将其放入单独的表中以使删除更容易。 - Tim van Dalen
2个回答

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

编辑:
id NOT IN (SELECT id FROM temp_table)是一种糟糕的结构。如果你有大型表格并且服务器设置调整为低内存,那么执行此操作会永远执行下去。

@Piskvor的答案查询更长,但在低内存设置上运行得更好。当我说“低内存”时,我的意思是数据库服务器没有占用完整的高端计算机,因此几乎适用于管理小型企业网站或类似网站的任何系统。


谢谢,这非常有帮助。但我想为将来的参考添加一些内容:您应该用您的唯一值替换 id。对于我来说,它是文章名称,因为两个表中的记录 id 不匹配。 - Tim van Dalen

4
这将为您提供那些在另一个表中没有相应行(通过recordid列进行匹配 - 您的可能不同)的行的id
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
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接