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)
-
MySQLで複数のデータを一度に挿入する方法を解説
MySQLでは、INSERT文を複数回実行しなくても、1つのINSERT文で複数行のデータを同時にテーブルへ挿入できます。この方法を使うと、コードが簡潔になるだけでなく、データベースとの通信回数が減るため、大量のデータを挿入する際のパフォーマンス向上にもつながります。 複数行を挿入するための基本構文 複数のレコードを一度に挿入するには、VALUES句の後に値のセットをカンマで区切って並べます。構文は以下のとおりです。 INSERT INTO テーブル名 VALUES(値1, 値2, .....N), (値1, 値2, .....N), (値1, 値2, .....N), (値1, 値2, ..
-
Tkinterで複数のキャンバスを同時に表示する方法
TkinterのCanvas(キャンバス)ウィジェットは、もっとも汎用性の高いウィジェットのひとつです。図形や円弧(アーク)、画像の描画はもちろん、アプリケーション内でのイラスト作成や複雑なレイアウトの構築など、幅広い用途に活用できます。 Canvasウィジェットを生成するには、canvas(root, **options) という形式でコンストラクタを呼び出します。さらに、create_text や create_image、create_arc といったファクトリ関数を使えば、キャンバス上にテキスト・画像・円弧などを自由に描き込むことも可能です。 アプリケーション全体のワークフローに一貫