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