SQLite | トリガー | 変更前後の値を参照する

トリガーでは挿入値や更新前後の値を参照できる。NEWINSERTUPDATEOLDDELETEUPDATEで利用する。

NEW.column_name
OLD.column_name
create trigger mytrigger insert on user
begin
insert into log values (new.name);
end;

DELETEトリガー

create table user (id integer, name text);
create table history (userid integer, goods text, sales integer);
insert into user values (1, 'devkuma');
insert into user values (2, 'kimkc');
insert into user values (3, 'araikuma');
insert into history values (1, 'PC', 550000);
insert into history values (2, 'Mouse', 34000);
insert into history values (1, 'Watch', 85000);
insert into history values (3, 'Light', 24000);
insert into history values (2, 'Mobile', 720000);
create trigger deleteuser delete on user
begin
delete from history where userid = old.id;
end;
delete from user where id = 2;

ユーザー2を削除すると、OLD.idを参照して該当する履歴も削除される。

UPDATEトリガー

create table product (id integer, name text);
create table history (user text, name text, sales integer);
insert into product values (1, 'Android');
insert into product values (2, 'iPhone');
insert into product values (3, 'iPad');
insert into history values ('devkuma', 'iPhone', 1390000);
insert into history values ('kimkc', 'iPad', 999000);
insert into history values ('araikuma', 'Android', 1092000);
insert into history values ('happykuma', 'iPhone', 965800);
create trigger updateproduct update of name on product
begin
update history set name = new.name where name = old.name;
end;
update product set name = 'iPhone 11' where name = 'iPhone';

OLD.nameが変更前、NEW.nameが変更後の値であり、履歴内の商品名も更新される。