MySQLのエラー『エラー1175: Safe Update Mode』の解決方法

MySQLのエラー『エラー1175: Safe Update Mode』の解決方法

MySQLでUPDATEやDELETEクエリを実行しようとした際に「Error 1175: You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column」というエラーが表示される場合がある。これは、MySQL Workbenchなどで「セーフアップデートモード」が有効になっており、プライマリキーやインデックス列に基づいたWHERE句が指定されていない場合に操作がブロックされる仕組みである。

1. エラーの発生条件

セーフアップデートモードが有効になっている環境で、主キーやインデックスを使用しないWHERE句、またはWHERE句自体が存在しないUPDATEやDELETEを実行した場合に発生する。

DELETE FROM users;

ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

2. セーフアップデートモードとは何か

誤って全件更新・削除してしまうことを防ぐためのモードであり、MySQL Workbenchではデフォルトで有効になっていることがある。

3. エラーの回避方法①:WHERE句に主キーやインデックスを指定する

セーフアップデートモードを無効にせずにエラーを回避するためには、WHERE句で主キーやインデックス付きの列を指定する。

DELETE FROM users WHERE id = 100;

このように主キー(idなど)を使うとエラーは発生しない。

4. エラーの回避方法②:セーフアップデートモードを一時的に無効化

現在のセッションに限ってセーフアップデートモードを無効にするには、以下のSQLを実行する。

SET SQL_SAFE_UPDATES = 0;

その後に問題のクエリを実行すればエラーは発生しない。

5. エラーの回避方法③:MySQL Workbenchの設定を変更

Workbenchの設定画面からセーフアップデートモードを恒久的にオフにできる。

  • Edit > Preferences > SQL Editor を選択
  • 「Safe Updates」のチェックを外す
  • Workbenchを再起動

6. UPDATE文でも同様のエラーが発生する

UPDATE文でも、WHERE句にインデックスが含まれていない場合はエラー1175が出る。

UPDATE users SET email = 'test@example.com';

これを回避するには、以下のように主キーで限定する必要がある。

UPDATE users SET email = 'test@example.com' WHERE id = 1;

7. セーフアップデートモードが有効か確認する方法

現在のセッションでセーフアップデートモードが有効かどうかは、以下のSQLで確認できる。

SELECT @@SQL_SAFE_UPDATES;

戻り値が「1」なら有効、「0」なら無効。

8. セーフアップデートモードをデフォルトで無効にする

MySQLの設定ファイル(my.cnf)に以下を追加すると、常に無効で起動できる。

[mysqld]
sql_safe_updates=0

設定後はMySQLを再起動する必要がある。

9. テスト環境と本番環境での扱いの違い

テスト環境では一時的に無効化しても問題ないが、本番環境では誤操作防止のためセーフアップデートモードを有効にしておく方が安全。

10. 明示的に全件更新・削除したい場合

セーフアップデートモードを一時的に無効化し、意図的に全行を対象にしたい場合は、SQL文の前に無効化コマンドを加える。

SET SQL_SAFE_UPDATES = 0;
DELETE FROM users;

操作完了後には再度有効にすることも可能。

SET SQL_SAFE_UPDATES = 1;

11. セーフアップデートモードの効果的な活用

セーフアップデートモードは開発中の事故防止策として非常に有効。設定の切り替えやWHERE句の工夫で柔軟に対応できるようにすることが望ましい。