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

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