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

MySQLでDELETE操作の実行後にトリガーを起動する方法【AFTER DELETE】

AFTER DELETEトリガーとは

MySQLでは、DELETE操作が実行された「後」にトリガーを起動したい場合、「AFTER DELETE」を使用します。これにより、レコードが削除されたタイミングで任意の処理を自動的に実行できるため、削除ログの記録や監査情報の保存などに活用できます。

基本構文

DELETE操作の実行後にトリガーを起動するには、以下のように構文を記述します。

DELIMITER //
CREATE TRIGGER yourTriggerName
   AFTER DELETE
   ON yourTableName FOR EACH ROW
BEGIN
   yourStatement1,
   .
   .
   N
END;
//

サンプルテーブルの作成

まず、動作確認用のテーブルを作成しましょう。

mysql> create table DemoTable(Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,FirstName varchar(100));
Query OK, 0 rows affected (0.62 sec)

続いて、INSERTコマンドを使ってテーブルにいくつかのレコードを挿入します。

mysql> insert into DemoTable(FirstName) values('John');
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable(FirstName) values('Mike');
Query OK, 1 row affected (0.12 sec)

SELECT文ですべてのレコードを表示して確認してみます。

mysql> select *from DemoTable;

上記のクエリを実行すると、次のような結果が出力されます。

+----+-----------+
| Id | FirstName |
+----+-----------+
| 1  | John      |
| 2  | Mike      |
+----+-----------+
2 rows in set (0.00 sec)

AFTER DELETEトリガーの作成

ここからは、AFTER DELETEを使用したトリガーを作成するクエリを紹介します。このトリガーは、レコードが削除されたときに、実行したユーザー名と削除日時をセッション変数に格納するものです。

mysql> DELIMITER //
mysql> CREATE TRIGGER history_of_Table
   AFTER DELETE
      ON DemoTable FOR EACH ROW
   BEGIN
      SELECT USER() INTO @userName;
      SELECT NOW() INTO @deleteDatetime;
   END; //
Query OK, 0 rows affected (0.18 sec)
mysql> DELIMITER ;

トリガーの動作確認

トリガーが正しく機能しているかどうかを確認するため、テーブルから最初のレコードを削除してみます。

mysql> delete from DemoTable where Id=1;
Query OK, 1 row affected (0.26 sec)

上記のコマンドで、テーブルから最初のレコード(Id=1)を削除しました。これにより、DELETEコマンドの実行後にトリガーが起動しているはずです。

まず、変数@userNameの値をSELECT文で確認してみましょう。

mysql> select @userName;

出力結果は以下の通りです。

+----------------+
| @userName      |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

削除操作を実行したユーザー(root@localhost)が正しく記録されていることがわかります。次に、トリガーが起動した時刻を確認します。

mysql> select @deleteDatetime;

出力結果は以下の通りです。

+---------------------+
| @deleteDatetime     |
+---------------------+
| 2019-07-09 21:06:31 |
+---------------------+
1 row in set (0.00 sec)

まとめ

このように、「AFTER DELETE」を使ったトリガーを定義することで、DELETE操作が実行された直後に自動的に処理を走らせることができます。今回の例ではユーザー名と削除日時を取得しましたが、OLDキーワードを併用して削除されたレコードの内容を別の履歴テーブルへ退避させるなど、データの監査やバックアップにも幅広く応用できます。

  1. MySQLでテーブル内の重複レコードをすべて削除する方法

    MySQLのテーブルから重複レコードを削除したい場合、DELETEコマンドを使用します。この記事では、実際にテーブルを作成し、重複データを挿入したうえで、DELETE文を使って重複レコードを削除する手順を具体的に解説します。 1. テーブルの作成 まず、練習用のテーブル「DuplicateDeleteDemo」を作成しましょう。このテーブルは、id(整数型)とname(可変長文字列)の2つのカラムを持つシンプルな構造です。 mysql> create table DuplicateDeleteDemo -> ( -> id int, -> name

  2. PythonでMySQLデータベースへの挿入後にIDを取得する方法

    はじめに PythonからMySQLデータベースへレコードを挿入する際、「今挿入したばかりのレコードのID(AUTO_INCREMENTで自動採番された値)をすぐに取得したい」というケースは非常によくあります。本記事では、pymysqlライブラリを使ってMySQLにデータを挿入し、その直後にIDを取得する具体的な手順を解説します。 前提条件 作業を始める前に、以下の環境が整っていることを確認してください。 MySQL 8.0.12 がインストールされていること Python 3.6.3(32ビット) がインストールされていること pipコマンドで pymysql がインストールされているこ