状況
期限切れクーポンを消す前に、同じ条件で退避テーブルを作る手順。作業者が 2 つの文を続けて実行しようとしている。
実行前に止めるべき点は?
CREATE TABLE coupons_bak AS SELECT * FROM coupons WHERE expired_at < '2026-10-01';DELETE FROM coupons WHERE expired_at <= '2026-10-01';正答
- 退避は < 、削除は <= で、ちょうど 2026-10-01 の行が退避されずに消える
- CREATE TABLE AS では主キーやインデックスがコピーされない
- 退避テーブル名に日付を入れないと、次回の作業で名前がぶつかる
- CREATE TABLE AS はトランザクションの中で実行しないと退避が不完全になる
解説
退避は expired_at < '2026-10-01'、削除は <= '2026-10-01' で、条件が 1 文字違う。ちょうど 2026-10-01 の行は削除されるのに退避されず、戻したいときにどこにも残っていない。退避と削除は同じ条件をコピーして使い、退避した行数と削除される行数が一致することを確かめる。CREATE TABLE AS で制約やインデックスが付かないのは事実だが、退避用としては問題にならないことが多く、データが消える誤りより優先度は低い。
参考: www.sqlite.org
この問題を含む 危険察知 のテストを制限時間つきで解く
危険察知クイズへ