SQLite | Triggers | Referencing Values Before and After a Change
Trigger statements can reference inserted values and values before or after an update.
NEW.column and OLD.column
Use the following qualifiers inside SQL executed by a trigger:
NEW.column_name
OLD.column_name
NEW is available for INSERT and UPDATE; OLD is available for DELETE and UPDATE. The column must belong to the table on which the triggering operation runs.
This trigger writes the inserted user’s name to log:
create trigger mytrigger insert on user
begin
insert into log values (new.name);
end;
DELETE trigger example
Create customer and purchase-history tables and add sample data:
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);
When a user is deleted, remove that customer’s history rows by referring to the deleted row’s OLD.id:
create trigger deleteuser delete on user
begin
delete from history where userid = old.id;
end;
delete from user where id = 2;
The user kimkc and the two history rows with userid 2 are deleted.
UPDATE trigger example
Create product and purchase-history tables:
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);
When a product name changes, update matching history rows. OLD.name is the previous value and NEW.name is the replacement:
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';
Both purchase-history rows formerly named iPhone now contain iPhone 11. The same NEW references can be used by INSERT triggers.