1

データベース内の重複ペアをチェックし、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 構文にエラーがあります。8行目の「LIMIT 10」付近で使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください

スクリプトは、この回答https://stackoverflow.com/a/6108860/1168944を使用して構築されています

実際には、スクリプトは制限が設定されていない少量のデータで問題なく動作しますが、大きなテーブル (600k エントリ) で実行するため、限られた量のみを処理するルーチンでこのスクリプトを分割する必要があります。プロセッサ、メモリなどのサーバー制限によるデータの

次の例も考慮に入れました: DELETE ステートメントの MySQL LIMITですが、制限がどれほど小さくても変更が実行されないため、結果は異なります。

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 に答える