MySQLWorkbenchでDELETE/UPDATEが実行出来ない
You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column
MySQLWorkbenchなどを使ってテーブルデータの操作をしている際に、DELETE/UPDATEで一気に対象テーブルのデータを変更しようとすると、以下のようなエラーが発生する事があります。
DELETE FROM users;
Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect.
原因
これは、Workbench上で誤って全てのデータを更新する事が無いようにサーバー接続時に自動で--safe-updatesの制約をつけている事が原因となります。
--safe-updatesを使用すると、行を特定するキー値を指定しないと行を消去出来ないため、GUI上での一括操作ミスを防ぐ事が可能になります。
試しに、where句を指定すれば問題なくupdateが可能になります。
DELETE FROM users WHERE id = 1001;
1 row(s) affected
解決方法
一時対応
一時的にSQLを実行したいのであれば、DELETE/UPDATEの前にSET SQL_SAFE_UPDATES = 0;を実行して、--safe-updatesを無効にすればWHERE句無しのDELETE/UPDATEが可能になります。
ただ、この設定は一度サーバーから接続を切ってサイド接続すると効果が無くなるので接続のたびに指定する必要があるので注意です。
現在の設定を確認する方法
この値が現在どうなっているか確認したい場合には、以下のコマンドを投げる事で確認する事が可能です。
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| sql_safe_updates | OFF |
+------------------+-------+
1 row in set (0.02 sec)
恒久対応
毎回接続のたびにSETコマンドを流すのが大変だという方のために、恒久的な対処方法もご紹介しようと思います。
まずはMySQLWorkbench>Preferencesに移動します。

設定ダイアログが表示されたら、SQL EditorのOtherエリアのSafe Updates(rejects UPDATEs and DELETEs with no restrictions)にチェックが入っていたら、このチェックを外します。


この設定を保存し、再度サーバーに繋ぎ直す事で--safe-updatesが無効になった状態で操作が可能になっているので、WHERE句無しのDELETE/UPDATEが可能になります。
注意
この設定はWorkbench全体の共通設定となっているため、例えばローカルDBと開発DB、本番DBなどにWorkbenchから接続を行ってデータ確認等をしている場合、各DBに対してもWHERE句無しのUPDATE/DELETE文が可能になってしまうので、データ紛失に繋がる恐れがあります。
可能であれば、この設定は残したままにしておいて、必要なタイミングでのみSET SQL_SAFE_UPDATES = 0;を実行するようにした方が運用ミスを避けれるので必要に応じて使い分けてください。
終わりに
以上のように、運用ミスを防いでくれる便利な機能ですが、OFFにする事も可能です。
用途に合わせて、設定を切り替えてみてください。
