LoginSignup
3
3

More than 5 years have passed since last update.

【MySQL・MariaDB】UPDATE, DELETE ミス防止・制限

Last updated at Posted at 2018-08-29

日頃の業務では直接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)
3
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3