古い値と新しい値の参照

広告

トリガはデータの追加や更新といった処理に伴って実行されますが、トリガの中で対象テーブルの更新前のデータや更新後のデータを参照したい場合があります。

例えばトリガの対象のテーブルに追加されたデータを他のテーブルにも同じように追加したい場合などです。

具体的にはトリガの実行されるSQL文において、次のようにOLDとNEWを使って参照します。

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

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

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

DELIMITER $$

CREATE TRIGGER trigger1 AFTER INSERT ON goods FOR EACH ROW
 BEGIN
   INSERT INTO list values(NEW.name);
 END;
$$

DELIMITER ;

トリガによって実行されるSQL文の中では「NEW.name」で「goods」テーブルの追加されたデータの「name」カラムの値を参照し、その値を「list」テーブルに追加しています。

サンプル

では実際に試してみます。次のようなテーブルを作成します。

mysql> create table user(id int, name varchar(20));
mysql> create table address(name varchar(20), pref varchar(20));

それぞれのテーブルには次のようにデータが追加してあります。

p3-1

p3-2

UPDATEトリガを1つ作成します。

mysql> delimiter $$

mysql> create trigger trigger_update after update on user for each row
    -> begin
    -> update address set name = new.name where name = old.name;
    -> end;
    -> $$

mysql> delimiter ;

今回のトリガは、「user」テーブルのデータが更新された時に実行されます。実行されるupdate文は「user」テーブルの更新前の値と同じ値を持つデータを対象に、「user」テーブルの更新後の値と同じ値で更新します。

では次のように「user」テーブルのデータを更新してみます。

mysql> update user set name = 'Kubo' where name = 'Kudou';

p3-3

「user」テーブルにはUPDATEトリガが設定されていましたので、更新される前の値と同じ値を持つ「address」テーブルのデータの値が「user」テーブルを更新した値と同じ値で更新されます。では「address」テーブルのデータを確認してみます。

p3-4

「address」テーブルのデータも更新されていることが確認できました。

( Written by Tatsuo Ikura )