データベース内の重複ペアをチェックし、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ですが、制限がどれほど小さくても変更が実行されないため、結果は異なります。