1

我有一个脚本,用于检查数据库中的重复对并选择除一个之外需要删除的所有条目。

我有这个脚本可以选择需要删除的前 100 个条目并且工作正常:

SELECT*  
  FROM vl_posts_testing 
  INNER JOIN (
       SELECT max(ID) AS lastId, `post_content`,`post_title`
       FROM vl_posts_testing WHERE vl_posts_testing.post_type='post'
       GROUP BY `post_content`,`post_title`
       HAVING count(*) > 1) duplic 
  ON duplic.`post_content` = vl_posts_testing.`post_content` 
  AND duplic.`post_title` = vl_posts_testing.`post_title`
WHERE vl_posts_testing.id < duplic.lastId 
AND vl_posts_testing.post_type='post' 
LIMIT 0,100

但是,当我尝试使用以下方法删除这组数据时:

DELETE vl_posts_testing 
  FROM vl_posts_testing 
  INNER JOIN (
       SELECT max(ID) AS lastId, `post_content`,`post_title`
       FROM vl_posts_testing WHERE vl_posts_testing.post_type='post'
       GROUP BY `post_content`,`post_title`
       HAVING count(*) > 1) duplic 
     ON duplic.`post_content` = vl_posts_testing.`post_content` 
     AND duplic.`post_title` = vl_posts_testing.`post_title`
WHERE vl_posts_testing.id < duplic.lastId 
AND vl_posts_testing.post_type='post' 
LIMIT 100

我收到休闲错误:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 8 行的“LIMIT 10”附近使用正确的语法

该脚本已使用此答案构建https://stackoverflow.com/a/6108860/1168944

实际上,该脚本在没有设置限制的情况下在少量数据上工作得很好,但是由于我在一个大表(大约 600k 个条目)上运行它,我需要将此脚本拆分为一个只处理有限数量的例程由于服务器限制(如处理器、内存等)而导致的数据量。

还考虑了这个例子:MySQL LIMIT on DELETE statement但结果不同,因为无论限制有多小,都不会执行任何修改。

4

1 回答 1

1

经过几次重试后,我找到了一种使其工作的方法:

DELETE vl_posts_testing 
  FROM vl_posts_testing 
  INNER JOIN (
       SELECT max(ID) AS lastId, `post_content`,`post_title`
       FROM vl_posts_testing WHERE vl_posts_testing.post_type='post'
       GROUP BY `post_content`,`post_title`
       HAVING count(*) > 1
       LIMIT 0,100 ) duplic 
     ON duplic.`post_content` = vl_posts_testing.`post_content` 
     AND duplic.`post_title` = vl_posts_testing.`post_title`
WHERE vl_posts_testing.id < duplic.lastId 
AND vl_posts_testing.post_type='post' 

实际上我所做的是对第一组数据设置一个内部限制,并将其与数据库的其余部分进行比较以使其工作。它有效,但我不确定这是不是正确的方法。

于 2013-06-19T14:25:45.573 回答