日頃の業務では直接DBを弄るのはあまり好ましくないが、この設定をしておけばまだ安心できます。
テストテーブル
> SELECT * FROM users;
+----+-------------+------+----------+------------+
| id | name | age | sex | position |
+----+-------------+------+----------+------------+
| 1 | 鈴木一郎 | 20 | 男 | 一般社員 |
| 2 | 田中二郎 | 33 | 男 | 係長 |
| 3 | 高橋三葉 | 27 | 女 | 一般社員 |
| 4 | 伊東四郎 | 40 | 男 | 部長 |
| 5 | 佐藤五郎 | 58 | 男 | 会長 |
| 6 | 渡辺六実 | 44 | 女 | 社長 |
| 7 | 山本七海 | 22 | 女 | 一般社員 |
| 8 | 山田八一 | 36 | 男 | 係長 |
| 9 | 中村九 | 52 | 男 | 一般社員 |
| 10 | 小林十成 | 20 | 男 | 一般社員 |
+----+-------------+------+-----------+------------+
わざと UPDATE ミスをしてみる
sql
>UPDATE users SET sex = 'おおおお';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 10 Changed: 0 Warnings: 0
WHERE 句を書く前にエンターしてしまいやってしまいました。。。
sql
MariaDB [curation]> SELECT * FROM users;
+----+--------------+------+--------------+--------------+
| id | name | age | sex | position |
+----+--------------+------+--------------+--------------+
| 1 | 鈴木一郎 | 20 | おおおお | 一般社員 |
| 2 | 田中二郎 | 33 | おおおお | 係長 |
| 3 | 高橋三葉 | 27 | おおおお | 一般社員 |
| 4 | 伊東四郎 | 40 | おおおお | 部長 |
| 5 | 佐藤五郎 | 58 | おおおお | 会長 |
| 6 | 渡辺六実 | 44 | おおおお | 社長 |
| 7 | 山本七海 | 22 | おおおお | 一般社員 |
| 8 | 山田八一 | 36 | おおおお | 係長 |
| 9 | 中村九 | 52 | おおおお | 一般社員 |
| 10 | 小林十成 | 20 | おおおお | 一般社員 |
+----+--------------+------+--------------+--------------+
10 rows in set (0.00 sec)
心臓がキュっとなる瞬間ですね。
safe-updates オプションを使用する
同じようなミスをもうしないために safe-updates
オプションを有効にしましょう
/etc/my.cnf
[mysql]
safe-updates
そのご mysql に再度接続
テストテーブルをもう一度準備し
> SELECT * FROM users;
+----+-------------+------+----------+------------+
| id | name | age | sex | position |
+----+-------------+------+----------+------------+
| 1 | 鈴木一郎 | 20 | 男 | 一般社員 |
| 2 | 田中二郎 | 33 | 男 | 係長 |
| 3 | 高橋三葉 | 27 | 女 | 一般社員 |
| 4 | 伊東四郎 | 40 | 男 | 部長 |
| 5 | 佐藤五郎 | 58 | 男 | 会長 |
| 6 | 渡辺六実 | 44 | 女 | 社長 |
| 7 | 山本七海 | 22 | 女 | 一般社員 |
| 8 | 山田八一 | 36 | 男 | 係長 |
| 9 | 中村九 | 52 | 男 | 一般社員 |
| 10 | 小林十成 | 20 | 男 | 一般社員 |
+----+-------------+------+-----------+------------+
もう一度同じミスSQLを流してみます。
sql
mysql >UPDATE users SET sex = 'おおおお';
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column
エラーになりミスSQLは実行されておりません!
更新したい場合はプライマリーキーを指定
> UPDATE users SET sex = 'おおおおお' WHERE id = 5;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
無事、正しいSQLが実行されました。
sql
> SELECT * FROM users;
+----+--------------+------+-----------------+--------------+
| id | name | age | sex | position |
+----+--------------+------+-----------------+--------------+
| 1 | 鈴木一郎 | 20 | 男 | 一般社員 |
| 2 | 田中二郎 | 33 | 男 | 係長 |
| 3 | 高橋三葉 | 27 | 女 | 一般社員 |
| 4 | 伊東四郎 | 40 | 男 | 部長 |
| 5 | 佐藤五郎 | 58 | おおおおお | 会長 |
| 6 | 渡辺六実 | 44 | 女 | 社長 |
| 7 | 山本七海 | 22 | 女 | 一般社員 |
| 8 | 山田八一 | 36 | 男 | 係長 |
| 9 | 中村九 | 52 | 男 | 一般社員 |
| 10 | 小林十成 | 20 | 男 | 一般社員 |
+----+--------------+------+-----------------+--------------+
10 rows in set (0.00 sec)