Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 从另一个表中不存在的表中删除所有记录_Mysql - Fatal编程技术网

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

Mysql 从另一个表中不存在的表中删除所有记录,mysql,Mysql,我有一张超过20000张唱片的桌子。 是时候清理一下了,因为查询开始时会占用大量资源。 我还有一张临时表,上面有最近的记录。第一个表中不存在于第二个表中的所有记录都可以删除。 但是,由于某些联接,我需要保留最近记录的id,因此我不能只是截断然后复制表。 你有办法做到这一点吗 DELETE FROM old_table WHERE id NOT IN (SELECT id FROM temp_table) 编辑: id不在从临时表中选择id中是一个糟糕的构造。如果您有大的表,并且服务器设置被调整

我有一张超过20000张唱片的桌子。 是时候清理一下了,因为查询开始时会占用大量资源。 我还有一张临时表,上面有最近的记录。第一个表中不存在于第二个表中的所有记录都可以删除。 但是,由于某些联接,我需要保留最近记录的id,因此我不能只是截断然后复制表。 你有办法做到这一点吗

DELETE FROM old_table WHERE id NOT IN (SELECT id FROM temp_table)
编辑: id不在从临时表中选择id中是一个糟糕的构造。如果您有大的表,并且服务器设置被调整为低内存,那么您将永远执行此操作

的答案是一个更长但更好的查询,它在低内存设置下最有效。当我说内存不足时,我指的是不占用完整高端计算机的数据库服务器,几乎所有管理小型企业网站或类似内容的系统。

这将为您提供没有与recordid列匹配的对应行的行ID-您的行在另一个表中可能不同:

SELECT t1.id 
    FROM firsttable t1
    LEFT JOIN secondtable t2
WHERE t1.recordid = t2.recordid
    AND t2.id IS NULL
这允许您检查您是否确实选择了要删除的正确行。然后,将其插入删除:

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
)

你能澄清一下吗?要从最近的记录中删除条目,还是从较大的表中删除条目?请注意,对于数据库,20k行实际上是一个小表。如果您遇到性能问题,您可能希望分析并查看相关表的索引。您好,这是针对ZenCart webshop的,每次加载站点时,它都会尝试选择很多项。我想从较大的表中删除项。最近的表实际上是一个数据源,我可以把它放在一个单独的表中,使删除更容易。谢谢,这非常有用。不过,我想添加一些内容供将来参考:您应该用您的唯一值替换id。对我来说,这是文章名,因为两个表中的记录id不匹配。