MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

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)での指定も検討してください。

  1. 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)

  2. MySQLでサブクエリのSELECT結果をもとにDELETEを実行する方法

    はじめにMySQLでは、DELETE文のWHERE句で削除対象と同じテーブルを直接サブクエリとして参照すると、「ERROR 1093: You cant specify target table for update in FROM clause」というエラーが発生します。この問題を回避するには、サブクエリ全体を別のサブクエリ(派生テーブル)でラップする方法が有効です。本記事では、実際の手順を例とともに解説します。テーブルの作成まず、テーブルを作成します。mysql> create table DemoTable1947    ( &nb