古い値と新しい値の参照
トリガはデータの追加や更新といった処理に伴って実行されますが、トリガの中で対象テーブルの更新前のデータや更新後のデータを参照したい場合があります。
例えばトリガの対象のテーブルに追加されたデータを他のテーブルにも同じように追加したい場合などです。
具体的にはトリガの実行される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));
それぞれのテーブルには次のようにデータが追加してあります。
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';
「user」テーブルにはUPDATEトリガが設定されていましたので、更新される前の値と同じ値を持つ「address」テーブルのデータの値が「user」テーブルを更新した値と同じ値で更新されます。では「address」テーブルのデータを確認してみます。
「address」テーブルのデータも更新されていることが確認できました。
( Written by Tatsuo Ikura )