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

MySQLで同じイベントとアクション時間に対して複数のトリガーを作成する方法


MySQL 5.7.2以降では、同一テーブル内の同じイベントとアクション時間(BEFORE UPDATEなど)に対して、複数のトリガーを作成できるようになりました。複数のトリガーが定義されている場合、イベントが発生すると各トリガーは指定された順序に従って順番に起動します。以下の例で具体的な動作を確認してみましょう。

実行例

ここでは、同じイベント「BEFORE UPDATE」に対して、「studentdetail_before_update」と「studentdetail_before_update2」という名前の2つのトリガーを作成します。これらはイベント発生時に順番に起動します。まず、次のようなデータを持つテーブル「Student_detail」を用意しました。

mysql> Select * from Student_detail;
+-----------+-------------+------------+
| Studentid | StudentName | address    |
+-----------+-------------+------------+
| 100       | Gaurav      | Delhi      |
| 101       | Raman       | Shimla     |
| 103       | Rahul       | Jaipur     |
| 104       | Ram         | Chandigarh |
| 105       | Mohan       | Chandigarh |
+-----------+-------------+------------+
5 rows in set (0.06 sec)

mysql> Delimiter //

続いて、以下のクエリで1つ目のトリガーを作成します。このトリガーは、UPDATEが実行される前に、更新対象の学生ID・更新日時・更新ユーザーをログテーブル「Student_detail_updated」に記録するものです。

mysql> Create Trigger studentdetail_before_update
    -> BEFORE UPDATE
    -> ON Student_detail
    -> FOR EACH ROW
    -> BEGIN
    -> DECLARE AUSER Varchar(40);
    -> SELECT USER() into AUSER;
    ->INSERT INTO Student_detail_updated(studentid, Updated_date,Updated_by) values(OLD.studentid,NOW(),AUSER);
    -> END; //
Query OK, 0 rows affected (0.17 sec)

mysql> Update student_detail SET Address = 'Ludhiana' Where studentName = 'Ram';
Query OK, 1 row affected (0.15 sec)
Rows matched: 1 Changed: 1 Warnings: 0

上記で作成したトリガーが起動されると、次のような結果が得られます。

mysql> Select * from student_detail_updated;
+-----------+---------------------+----------------+
| studentid | Updated_date        | Updated_by     |
+-----------+---------------------+----------------+
| 104       | 2017-11-22 16:17:16 | root@localhost |
+-----------+---------------------+----------------+
1 row in set (0.00 sec)

次に、同じイベントとアクション時間に対する2つ目のトリガーを、以下のように作成します。

mysql> Create Trigger studentdetail_before_update2
    -> BEFORE UPDATE
    -> ON Student_detail
    -> FOR EACH ROW FOLLOWS studentdetail_before_update
    -> BEGIN
    -> DECLARE AUSER Varchar(40);
    -> SELECT USER() into AUSER;
    -> INSERT INTO Student_detail_updated(studentid, Updated_date,Updated_by) values(OLD.studentid,NOW(),AUSER);
    -> END; //
Query OK, 0 rows affected (0.15 sec)

ここでのポイントは「FOLLOWS studentdetail_before_update」という句です。「FOLLOWS」キーワードを使用することで、このトリガーが1つ目のトリガーのに起動するよう明示的に指定しています。なお、逆に既存トリガーより先に実行したい場合は「PRECEDES」キーワードを使用します。

mysql> Update Student_detail SET Address = 'Patiala' WHERE studentname = 'Mohan';
Query OK, 1 row affected (0.08 sec)
Rows matched: 1 Changed: 1 Warnings: 0

再度値を更新してログテーブルを確認すると、同じイベントとアクション時間に対して2行のレコードが記録されていることがわかります。2行目が「studentdetail_before_update」トリガーによる記録、3行目が「studentdetail_before_update2」トリガーによる記録です。

mysql> Select * from student_detail_updated;
+-----------+---------------------+----------------+
| studentid | Updated_date        | Updated_by     |
+-----------+---------------------+----------------+
| 104       | 2017-11-22 16:17:16 | root@localhost |
| 105       | 2017-11-22 16:19:28 | root@localhost |
| 105       | 2017-11-22 16:19:28 | root@localhost |
+-----------+---------------------+----------------+
3 rows in set (0.00 sec)
  1. MySQLで複数のデータを一度に挿入する方法を解説

    MySQLでは、INSERT文を複数回実行しなくても、1つのINSERT文で複数行のデータを同時にテーブルへ挿入できます。この方法を使うと、コードが簡潔になるだけでなく、データベースとの通信回数が減るため、大量のデータを挿入する際のパフォーマンス向上にもつながります。 複数行を挿入するための基本構文 複数のレコードを一度に挿入するには、VALUES句の後に値のセットをカンマで区切って並べます。構文は以下のとおりです。 INSERT INTO テーブル名 VALUES(値1, 値2, .....N), (値1, 値2, .....N), (値1, 値2, .....N), (値1, 値2, ..

  2. Tkinterで複数のキャンバスを同時に表示する方法

    TkinterのCanvas(キャンバス)ウィジェットは、もっとも汎用性の高いウィジェットのひとつです。図形や円弧(アーク)、画像の描画はもちろん、アプリケーション内でのイラスト作成や複雑なレイアウトの構築など、幅広い用途に活用できます。 Canvasウィジェットを生成するには、canvas(root, **options) という形式でコンストラクタを呼び出します。さらに、create_text や create_image、create_arc といったファクトリ関数を使えば、キャンバス上にテキスト・画像・円弧などを自由に描き込むことも可能です。 アプリケーション全体のワークフローに一貫