[mysql]MySQLはUPDATE文やDELETE文にORDER BY句やLIMIT句を使えるが、使わないほうがいい

徒然草2.0

結論から言うと、DELETE文やUPDATE文にORDER BY句やLIMIT句を使うことができる。実行した結果をソートした順のレコードへ処理を適用することが可能ということだ。以前に自分もWebアプリケーション内で使ったことがあるが、SQL標準におそらくないものでありMySQL独自の拡張構文であり、(軽く調べた限り)PostgreSQLやOracleでは使えない。

何のレコードに対して削除や更新をかけているのか分かりにくいという意味ではMySQLにずぶずぶで上手く使う自身があるのならば使用しても構わないのだが、MySQLでしか使えないという意味では、バッドノウハウの書き方になるだろう。なぜなら、そもそもDELETEやUPDATEがSELECTやVIEWと同様にリスト取得した後の先頭レコードに対して処理が掛かる…という手続き型言語的な順番概念がない=1トランザクションなところががRDBの分かりやすいところが、分かりにくくなってしまうから。(Where句で絞り込まれた対象レコードへ一律処理がかかるという常識が通用しなくなると混乱する人も出てくる)

(補足…同じようなことを繰り返すが)

レコードを追加した日の最終のレコードから古い順削除したいのならば、delete from users order by desc user_id limit 1;みたいなクエリは実行可能(ソラで書いたSQLでためしていないが)、間違えた時にどれくらいダメージを被るかわからない。SQLを見てぱっと見で意図がわかりにくい(と思う)サブクエリで条件抽出をしたほうが無難だろう。

コメント

タイトルとURLをコピーしました