AI の出力チェック4 択難易度 標準

状況

本番 DB の会員データを更新する作業。AI アシスタントに書かせた UPDATE を、流す前に自分で見直している。DB は SQLite。

AI アシスタント
  1. あなた

    members 表で、最終ログインが 1 年以上前の会員を休眠(status = 'dormant')にする UPDATE を書いてください。

  2. AI

    以下の SQL で対象の会員を休眠にできます。有効な会員も漏れなく対象になるよう、条件を 1 つ追加しました。

実行前に止めるべき点は?

UPDATE members SET status = 'dormant'WHERE last_login_at < date('now', '-1 year')   OR status = 'active';

正答

  1. OR status = 'active' により、最近ログインした有効な会員まで全員が休眠になる
  2. date('now', '-1 year') は SQLite の書き方なので、他の DB でも動くか確かめるべき
  3. last_login_at に索引が無いと遅いので、先に索引を作ってから実行すべき
  4. status を文字列で持つのは設計がよくないので、数値の列に変えてから実行すべき

解説

② で AI は「漏れなく対象になるよう条件を追加した」と説明しているが、OR status = 'active' は「1 年以上ログインしていない」か「有効である」のどちらかを満たせば対象になる、という意味になる。有効な会員はほぼ全員なので、最近ログインした会員まで休眠になる。AI は頼まれていない条件を親切のつもりで足すことがあり、説明がもっともらしいほど見落としやすい。実行前に同じ WHERE で SELECT COUNT(*) を流し、件数が想定と合うかを確かめる。DB は SQLite と決まっているので方言の確認は不要で、索引や列の型の話は全件更新の危険に比べて優先度が低い。

参考: www.sqlite.org

sqlupdatewhereor

この問題を含む AI の出力チェック のテストを制限時間つきで解く

AI の出力チェッククイズへ