0.前言
上一篇中,簡單使用觸發器同步倆個表的數據,但是出現了old和new的用法,這一篇文章中簡單總結一下。
1.插入操作 insert
對於insert語句,如果原表中沒有數據,那么對於插入數據后表來說新插入的那條數據就是new。比如下面是SQL
drop trigger if exists insert_tableB;
-- 如果有這個觸發器就先刪除
create trigger insert_tableB
-- 觸發表名稱 insert_tableB
after insert
-- 觸發條件,在insert操作之后
on tableA
-- 需要在哪個表觸發
for each row
begin
insert into tableB (`code`,`id`)
values(
new.`code`,
new.`id`
);
-- sql語句
end;
當我們在tableA表中執行insert操作后,tableB表會自動插入一條數據,這個時候,這條數據用new表示。
2.更新操作 update
當使用update語句的時候,當修改原表數據的時候相對於修改數據后表的數據來說原表中修改的那條數據就是old,而修改數據后表被修改的那條數據就是new。
比如我們下面這個觸發器:
drop trigger if exists update_tableB;
-- 如果有這個觸發器就先刪除
create trigger update_tableB
-- 觸發表名稱 update_tableB
after update
-- 觸發條件,在update操作之后
on tableA
-- 需要在哪個表觸發
for each row
begin
update tableB
set
code_code = new.`code`,
id_id =new.`id`
WHERE code_code=old.`code`;
-- sql語句
end;
其中比較關鍵的是:
update tableB
set
code_code = new.`code`,
id_id =new.`id`
WHERE code_code=old.`code`;
可以看出,我們set的是新值(new)。而用where條件限定的是舊值(old)。
這樣就完成更新操作了。
3.刪除操作delete
當使用delete語句的時候,刪除的那一條數據相對於刪除數據后表的數據來說就是old。
比如下面這個觸發器
drop trigger if exists delete_tableB;
-- 如果有這個觸發器就先刪除
create trigger delete_tableB
-- 觸發表名稱 delete_tableB
after DELETE
-- 觸發條件,在delete操作之后
on tableA
-- 需要在哪個表觸發
for each row
begin
DELETE from tableB
WHERE code_code=old.`code`;
-- sql語句
end;
可以看出,我們刪除B表的操作,where限定條件也是old。
4.簡單總結
old表示插入之前的值,new表示新插入的值;old用在刪除和修改,new用在添加和修改。