1つのトリガーで複数のSQL文を実行する

CREATE TRIGGER 文でトリガーを作成する時、 1 つのトリガーで複数の SQL 文を実行するように記述することができます。ここでは MySQL で 1 つのトリガーで複数の SQL 文を実行する方法について解説します。

(Last modified: )

複数のSQL文を実行する

1つのトリガーで複数の SQL 文を実行するには、 BEGIN ... END 文を使って次のようにトリガーを作成します。

delimiter //

CREATE TRIGGER trigger_name
  { BEFORE | AFTER } { INSERT | UPDATE | DELETE }
  ON tbl_name FOR EACH ROW
  BEGIN
     実行するSQL文1;
     実行するSQL文2;
     ...
  END;//

delimiter ;

※ delimiter コマンドを最初と最後に使っている理由はこのページの最後で解説しています。

BEGIN から END までの間にトリガーが起動したときに実行する SQL 文を記述してください。複数の SQL 文を記述するので、それぞれの SQL 文の最後にはセミコロン(;)を記述してください。

-- --

それでは実際に試してみます。最初にトリガーの対象となるテーブルを次のように作成しました。

create table saleslist(staffname varchar(10), productname varchar(10), sales int);

複数のSQL文を実行する(1)

今回はトリガーが起動したら 2 つのテーブルのデータを更新します。商品別の売上記録用テーブルと、スタッフ別の売上記録用テーブルです。次のようにテーブルを作成しました。

create table staffreport(id int auto_increment primary key, name varchar(10), sales int);
create table productreport(id int auto_increment primary key, name varchar(10), sales int);

複数のSQL文を実行する(2)

次にトリガーを作成します。今回は対象の操作として INSERT 、起動するタイミングは AFTER で次のように作成しました。

delimiter //

create trigger insert_trigger after insert on saleslist for each row
begin
  insert into staffreport (name, sales) values(new.staffname, new.sales);
  insert into productreport (name, sales) values(new.productname, new.sales);
end;//

delimiter ;

複数のSQL文を実行する(3)

トリガーの作成が完了しました。なおトリガーの中で使っている new.カラム名 は、対象となっているテーブルで追加や削除されてデータの指定のカラムの値を取得するためのものです。詳しくは別のページで解説します。

-- --

それではトリガーの対象となっている saleslist テーブルにデータを 2 つ追加します。

insert into saleslist values('Yamada', 'Chair', 15000);
insert into saleslist values('Suzuki', 'Desk', 22000);

複数のSQL文を実行する(4)

対象のテーブルにデータが INSERT されましたので INSERT トリガーが起動して 2 つの記録用のテーブルが更新されます。ではテーブルからデータを取得してみます。

select * from staffreport;
select * from productreport;

複数のSQL文を実行する(5)

2 つのテーブルがそれぞれ更新されていることが確認できました。このように BEGIN ... END 文を使用することで 1 つのトリガーで複数の SQL 文を実行することができます。

delimiter コマンドについて

今回使用した書式の中で使用している delimiter コマンドについて説明をしておきます。MySQL ではステートメントの区切りとしてセミコロン(;)を使用していますが BEGIN ... END 文の中で実行する SQL 文の最後にも区切りとしてセミコロンを記述しなければなりません。その為、 CREATE TRIGGER 文が本当は END までのはずが、途中で終わりと判断されてしまうためエラーになってしまいます。

CREATE TRIGGER trigger_name
  { BEFORE | AFTER } { INSERT | UPDATE | DELETE }
  ON tbl_name FOR EACH ROW
  BEGIN
     実行するSQL文1;  <-- ここで CREATE TRIGGER 文が終わりと判断される
     実行するSQL文2;
     ...
  END;  <-- 本当は ENDのあとのセミコロンで CREATE TRIGGER 文は終わり

そこで CREATE TRIGGER 文を実行する間だけ delimiter コマンドを使ってステートメントの区切り文字を別の文字(今回は // )に変更しておきます。 BEGIN ... END 文の中でセミコロンを使用していてもステートメントの終わりと判断されなくなり、最後の // までが CREATE TRIGGER 文として扱われます。

delimiter // <- 区切り文字を // に変更

CREATE TRIGGER trigger_name
  ...
  BEGIN
     実行するSQL文1;  <-- セミコロンを記述しても大丈夫
     実行するSQL文2;
     ...
  END;//  <-- END; の後の // で CREATE 文は終わる

delimiter ; <-- 区切り文字を元に戻しておく

最後に delimiter コマンドをもう一度使ってステートメントの区切り文字を元のセミコロンに戻しておくことを忘れないでください。

-- --

CREATA TRIGGER 文でトリガーを作成する方法について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。