mysql触发器中的new和old
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用在添加和修改。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具