MySQLのセーフモードでDELETEを実行する方法|SQL_SAFE_UPDATESの設定手順
MySQLでは、安全更新モード(セーフアップデート)が有効になっていると、WHERE句にキー列を指定しないDELETEやUPDATEが実行できず、エラーになることがあります。このような場合は、SETコマンドを使って一時的にセーフモードを解除することで、削除処理を行えます。
セーフモードを解除して削除するクエリ
セーフモードを解除するには、以下のクエリを実行します。
SET SQL_SAFE_UPDATES = 0;
動作確認用テーブルの作成
まず、上記クエリの挙動を理解するために、サンプルテーブルを作成しましょう。テーブル作成のクエリは次のとおりです。
mysql> create table SafeDeleteDemo -> ( -> Price int -> ); Query OK, 0 rows affected (0.50 sec)
レコードの挿入
続いて、INSERTコマンドを使ってテーブルにレコードを挿入します。
mysql> insert into SafeDeleteDemo values(100); Query OK, 1 row affected (0.11 sec) mysql> insert into SafeDeleteDemo values(200); Query OK, 1 row affected (0.19 sec) mysql> insert into SafeDeleteDemo values(300); Query OK, 1 row affected (0.09 sec) mysql> insert into SafeDeleteDemo values(500); Query OK, 1 row affected (0.14 sec) mysql> insert into SafeDeleteDemo values(1000); Query OK, 1 row affected (0.10 sec) mysql> insert into SafeDeleteDemo values(150); Query OK, 1 row affected (0.11 sec)
削除前の全レコード表示
レコードを削除する前に、現在テーブルに格納されているすべてのデータを確認しておきましょう。
mysql> select *from SafeDeleteDemo;
実行結果は以下のとおりです。
+-------+ | Price | +-------+ | 100 | | 200 | | 300 | | 500 | | 1000 | | 150 | +-------+ 6 rows in set (0.00 sec)
SETコマンドでセーフモードを解除して削除する
それでは、SETコマンドを使ってセーフモードを解除します。
mysql> SET SQL_SAFE_UPDATES = 0; Query OK, 0 rows affected (0.00 sec)
これでセーフモードが無効になったので、通常どおりDELETE文でレコードを削除できます。ここでは「Price」が500以上のレコードを削除してみましょう。
mysql> delete from SafeDeleteDemo where Price >=500; Query OK, 2 rows affected (0.14 sec)
削除後のレコード確認
削除後に残っているレコード数を確認します。
mysql> select *from SafeDeleteDemo;
以下の出力結果から、「Price」が500以上の2件が正常に削除されたことがわかります。
+-------+ | Price | +-------+ | 100 | | 200 | | 300 | | 150 | +-------+ 4 rows in set (0.00 sec)
セーフモードを再度有効に戻す
作業が完了したら、同じSETコマンドでセーフモードを元に戻しておくことをおすすめします。誤操作によるデータ消失を防ぐためです。
mysql> SET SQL_SAFE_UPDATES = 1; Query OK, 0 rows affected (0.00 sec)
なお、SQL_SAFE_UPDATESの設定はセッション単位で有効となるため、接続を切断するとデフォルト値に戻ります。恒久的に変更したい場合は、設定ファイル(my.cnf / my.ini)での指定も検討してください。
-
MySQLのDELETE文とIN句を組み合わせて1つのクエリで複数レコードを削除する方法
MySQLでは、IN()句を活用することで、複数の条件値に一致するレコードを1つのDELETEクエリでまとめて削除できます。個別に削除クエリを実行する必要がなく、効率的なデータ操作が可能になります。ここでは、サンプルテーブルを作成し、実際にIN()句を使ったレコード削除の手順を解説します。1. サンプルテーブルの作成まず、テーブルを作成しましょう。mysql> create table DemoTable1922 ( StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY, StudentName varchar(20)
-
MySQLでサブクエリのSELECT結果をもとにDELETEを実行する方法
はじめにMySQLでは、DELETE文のWHERE句で削除対象と同じテーブルを直接サブクエリとして参照すると、「ERROR 1093: You cant specify target table for update in FROM clause」というエラーが発生します。この問題を回避するには、サブクエリ全体を別のサブクエリ(派生テーブル)でラップする方法が有効です。本記事では、実際の手順を例とともに解説します。テーブルの作成まず、テーブルを作成します。mysql> create table DemoTable1947 ( &nb