技術とか戦略とか

IT技術者が技術や戦略について書くブログです。

deleteの前にselectをしてミスを防ぐ

作業ミスを防ぐためのちょっとしたテクニックです。
参考書にはあまり載っていない暗黙知的なテクニックで、運が良ければ先輩から教えてもらえるのですが、逆に言うと運が悪いと教えてもらえないかもしれないので、文章に起こします。
 
特にオートコミット(commitを発行しなくても更新が反映される設定)の場合に効果を発揮します。
delete文で誤ったレコードを消すと取り返しがつかなくなることがあるのですが、事前にdelete文と同じ条件でselect文を打つことで、delete文のミスに事前に気付くことができます。
 
例えば、このようなテーブルがあるとします。
商品
+--------+--------+------------+
| 商品ID | 商品名 | 引き渡し先 |
+--------+--------+------------+
| 1 | 商品1 | A社 |
| 2 | 商品2 | B社 |
| 3 | 商品3 | NULL |
| 4 | 商品4 | D社 |
+--------+--------+------------+
 
このテーブルについて、引き渡し先が登録されているレコード(NULLではないレコード)を削除しようとした場合、以下のようなSQL文を作成します。
delete from 商品 where 引き渡し先 is not null;
しかし、仮にここで条件文のnotを忘れると、逆に引き渡し先が登録されていないレコード(NULLのレコード)を削除してしまい、取り返しがつかなくなります。
 
そこで、同じ条件で事前にSELECT文を発行します。
select * from 商品 where 引き渡し先 is not null;
このselect文を発行することで、事前に消えるレコードを見ることができます。
今回の例では以下のレコードが消えることを確認できます。
+--------+--------+------------+
| 商品ID | 商品名 | 引き渡し先 |
+--------+--------+------------+
| 1 | 商品1 | A社 |
| 2 | 商品2 | B社 |
| 4 | 商品4 | D社 |
+--------+--------+------------+
 
-----------------------
 
作業ミスを防ぐための暗黙知的なテクニックは他にもあるので、思い出したら随時書きます。