問題の概要
誰にでも経験があることでしょう。MySQL Workbenchでデータセットをクリーンアップしようとした際(例えば、1,500人の非アクティブなユーザーにフラグを立てるなど)、UPDATE文が壁にぶつかってしまうことがあります。行が更新される代わりに、次のようなイライラする拒否通知が表示されます。
Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column.
これはバグではありません。組み込みのセーフティネット(安全装置)です。デフォルトでは、MySQL Workbenchは誤ってテーブル全体を消去してしまう可能性のあるクエリの実行を防止します。特定の主キー(プライマリキー)を指定するか、一括操作を行う意図があることを明示的に確認する必要があります。
このエラーが発生する理由
Safe Updates(セーフアップデート)機能は、データの守護神です。この機能が有効な場合、以下の特定の要件を満たさないUPDATEまたはDELETE文はすべてブロックされます。
- クエリに、キー列(
idやuuidなど)を参照するWHERE句が含まれていること。 - 影響範囲を制限するために、クエリに
LIMIT句が含まれていること。
インデックスのない列(「category」や「status」フィールドなど)を使用してレコードを更新しようとすると、安全チェックが作動します。これは、フィルター(絞り込み条件)を完全に忘れてしまっている可能性があると判断されるためです。
解決策 1:SQLによるクイック修正(セッションベース)
一度限りの一括更新を実行する必要がありますか?現在の接続に対して一時的に制限を無効にすることができます。グローバルなセキュリティ設定を変更しないため、これが最もクリーンな方法です。
ステップ 1:保護を解除する
SET SQL_SAFE_UPDATES = 0;
ステップ 2:クエリを実行する
これで、MySQLが操作を許可するようになります。例えば、2024年の開始以降ログインしていないユーザーを更新する場合:
UPDATE users
SET status = 'archived'
WHERE last_login < '2024-01-01';
ステップ 3:セーフティネットを復元する
ドアを開けっぱなしにしないでください。タスクが完了したら、保護を元に戻します。
SET SQL_SAFE_UPDATES = 1;
解決策 2:WorkbenchのGUIでSafe Updatesを無効にする
大規模な分析データセットを頻繁に扱う場合、この機能は助けというより障害に感じられるかもしれません。ローカル設定で永続的に無効にすることができます。
- MySQL Workbenchを起動します。
- Edit(編集) > Preferences(設定)(macOSユーザーは MySQL Workbench > Settings)に移動します。
- 左側のサイドバーから SQL Editor を選択します。
- 右ペインの下部にある 「Safe Updates" (rejects UPDATEs and DELETEs with no restrictions)」 を探します。
- ボックスの チェックを外し、OK をクリックします。
注意: この変更はすぐには適用されません。接続を再起動する必要があります。現在のSQLタブを閉じ、サーバーに再接続して新しい設定を読み込んでください。
解決策 3:主キー(プライマリキー)を使った「トリック」
サーバーの変数や設定を変更できない場合もあります。その場合は、実質的には何もしないものの「キーを使用する」という要件を満たす主キー参照を追加することで、安全チェックをクリアできます。
テーブルで自動インクリメントの id を使用している場合は、クエリに AND id > 0 を追加します。
UPDATE products
SET price = price * 1.05
WHERE category = 'Software'
AND id > 0;
すべての有効な行は0より大きいIDを持っているため、ロジックは変わりませんが、データベースのセキュリティフィルターは条件を満たしたと判断します。
確認手順
変更が適用されたことを確認するには、以下の手順に従ってください。
- キー以外の列を使用して、1行に対して小さなテスト更新を実行します。
- 画面下部の Action Output を確認します。
- 緑色のチェックマークと
x row(s) affectedが表示されれば成功です。 - エラー1175が解消されない場合は、
SET SQL_SAFE_UPDATES = 0;が アクティブなタブ で実行されたか確認してください。ウィンドウを切り替えると設定が失われるためです。
一括更新のベストプラクティス
セーフモードを無効にすることは大規模な変更には非常に便利ですが、セーフティネットなしで作業することになります。安全を保つために、以下の習慣を心がけてください。
- 影響をプレビューする: 常に、全く同じ
WHERE句を使用したSELECTを最初に実行してください。50行を想定していたのに5万行が表示されたなら、大惨事を未然に防げたことになります。 - トランザクションを使用する: ロジックを保護ブロックで囲みます。これにより、結果を確定させる前に内容を確認できます。
START TRANSACTION; UPDATE inventory SET stock = 0 WHERE expiration_date < NOW(); -- 結果を確認... -- 成功?実行:COMMIT; -- エラー?実行:ROLLBACK;
- **バックアップを取る:** 本番環境の大規模なテーブルを変更する前に、クイックSQLダンプをエクスポートしておきます。失敗した一括更新を手動で元に戻すよりも、バックアップを復元する方がはるかに高速です。

