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