状況
手順書には「対象は 2023 年以前に最終ログインした約 300 件」とある。作業者が削除前の確認を実行し、続けて DELETE を打った。
Enter の前に止めるべき点は?
sqlite> SELECT COUNT(*) FROM users WHERE last_login < '2024-01-01';31877sqlite> DELETE FROM users WHERE last_login < '2024-01-01';正答
- COUNT(*) ではなく COUNT(id) で数えないと正確な件数にならない
- 大量削除になるので、LIMIT を付けて 1000 件ずつ消すべき
- 日付は '2024-01-01 00:00:00' と時刻まで書くべき
- 想定 300 件に対して 31877 件。DELETE に進まず原因を確かめる
解説
削除前に件数を数えるのは、想定と比べて条件の誤りに気づくため。手順書の約 300 件に対して 31877 件は 100 倍で、条件・データ・手順書のどれかが誤っている。それなのに次の行で DELETE を打っているのが最も危ない。分割削除はロックや負荷を抑える良い作法だが、誤った条件のまま分割しても全部消えるのは同じ。COUNT(*) と COUNT(id) は id が NULL でない限り同じ結果になる。
この問題を含む 危険察知 のテストを制限時間つきで解く
危険察知クイズへ