古い値と新しい値への参照

トリガーはデータの追加や更新といった処理に伴って実行されますが、カラムの値を新しい値で更新した場合などに更新前の値と更新後の新しい値を知りたい場合があります。

例えばトリガーの対象テーブルのデータが更新されたら、他のテーブルの同じ値を持つデータを新しいデータで更新したい場合などです。

そこでトリガーの定義文の中でBEGINからENDまでの間では次のような記述を行うことができます。

NEW.カラム名    INSERT及びUPDATEで使用可能
OLD.カラム名    DELETE及びUPDATEで使用可能

カラム名はトリガーの対象テーブルの中のカラムである必要があります。

例としてINSERT文の場合で考えてみます。「id」と「name」というカラムを持つ「goods」テーブルを対象にINSERTが行われた時のトリガーを作成します。トリガーによって実行されるSQL文では、新しく追加されたデータの「name」カラムの値を取得し、別の「list」テーブルに挿入するようにしてみます。

create trigger sample insert on goods
begin
  insert into list values(new.name);
end;

このように新しく追加されたデータの中で指定したカラムの値を取得し、実行するSQL文の中で使用することができます。

今度はDELETE文の場合で考えてみます。「goods」テーブルを対象にDELETEが行われた時、削除される前のデータの「name」カラムの値を取得し、別の「list」テーブルの「name」カラムの値と一致するデータを削除するようにしてみます。

create trigger sample delete on goods
begin
  delete from list where name = old.name;
end;

なおUPDATE文の場合は、実行前と後のカラムの値を参照することが可能です。

サンプル

では実際に試してみます。

次のような2つのテーブルを用意します。

p2-1

p2-2

「goods」テーブルに対してUPDATEトリガーを設定します。データが更新されたら、「name」カラムの更新前の値と同じ値を持つ「list」テーブルのデータを同じ新しい値で更新します。

create trigger updatetrigger update on goods
begin
update list set name = new.name where name = old.name;
end;

p2-3

では「goods」テーブルにUPDATE文を実行してみます。

p2-4

「list」テーブルの中身を確認します。

p2-5

「list」テーブルの該当データの指定したカラムの値が自動的に更新されていることが分かります。