S_a_k_Uの日記みたいなDB

~サクゥーと呼ばないで~

DELETE文でLIMIT句

トランザクションログとかREDOログとかの制約から、削除するレコード数に制限を付けたい場合。
ループで、削除行が指定行数より少ない行数になるまで削除することで、ある条件のレコードを全て削除するような感じ。
MySQLではできるらしい。
MySQL :: MySQL 4.1 リファレンスマニュアル :: 6.4.5 DELETE 構文

DELETE に MySQL 固有のオプションである LIMIT row_count を指定すると、クライアントに制御を戻す前に削除する最大レコード数をサーバに指示することができます。このオプションは、特定の DELETE コマンドで実行にあまり時間がかからないようにする必要があるときに使用できます。この場合、影響を受けたレコードの数が LIMIT 値よりも小さくなるまで、DELETE コマンドを単純に繰り返すことができます。

処理時間のことだけ書いてるけど、トランザクションログとかの制約に対してはDELETE文毎にコミットしないとね。
なので、自前のトランザクションとかの対処が必要だったり。
他のDBMSでは実装されていないので、条件をGROUP BYでソートして、カウントを取りながらある程度の件数で削除する条件を探してDELETE文を実行するような感じで、DELETE文の実行回数を抑えつつ、削除するレコード数も制限してみたり。