标签:25 触发器 old insert update mysql new before
触发器: 当我们希望在事件之前或者之后自动执行操作时,我们可以设定触发器,触发器可在设定以下事件之前或者之后:
- delete
- insert
- update
25.1 创建触发器
-- 下面创建的触发器在每次对products表的某一行插入之后都会打印"insert a row"
create trigger newproduct after insert on products
for each row select "insert a row";
25.2 删除触发器
drop trigger newproduct;
几种不同的触发器的特点
insert触发器
insert触发器有以下特点:
- 在insert触发器代码中,可以引用名为NEW的虚拟表去访问插入行
- 在before insert触发器中,new的值也可以被更新
- 对auto_increment列,new表该列在insert之前包含0,在insert之后包含新的自动生成的值
示例:
create trigger neworder after insert on orders
for each row select new.order_num into @lastid;
before触发器一般用于数据验证和数据净化
delete触发器
在delete之前和之后,可以通过old表来访问被删除的行,old表的数据是只读的。
例如下面的触发器用于在删除之前,将数据插入到备份表中
create trigger deleteorder before delete on orders
for each row
begin
insert into archieve_orders(order_num, order_date, cust_id) values (old.order_num, old.order_date, old.cust_id);
end;
尽量使用delete before而不是delete after触发器,前者在触发器语句失败时,不会执行删除语句。保证了数据的安全
update触发器
update触发器在update语句执行之前和执行之后执行。
update触发器具备以下特点:
- 在触发器(无论是before还是after)代码中,可以用old访问update之前的值,而用new表访问之后的值
- 即便是before update触发器,还没有update时,也可以修改new表
- old表的值都是只读的无法更新
如以下触发器对update语句的vend_state进行修饰,将其全置为大写:
create trigger updatevendor before update on vendors
for each row set new.vend_state = update(new.vend_state);
标签:25,触发器,old,insert,update,mysql,new,before 来源: https://www.cnblogs.com/ronnieos/p/15924822.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。