一、概念
触发器是自Mysql5.0开始支持的一种过程式数据库对象。
具体而言,触发器就是Mysql响应insert、update、delete语句而自动执行的一条Mysql语句(或位于begin和end语句之间的一组Mysql语句)。
需要注意的是触发器只对增、删、改语句响应,其他Mysql语句是不支持触发器的。
二、创建触发器
在数据库mysql_test的表customers中创建一个触发器customers_insert_trigger,用于每次向表customers中插入一行数据时,将用户变量str的值设置为”one customer added!”。
create trigger mysql_test.customers_insert_trigger
after insert on mysql_test.customers --触发时间可以after也可before
for each row set @str='one customers added!';--for each row的意思是每一行执行都激活触发器
创建完毕后,可以插入一条数据测试一下
insert mysql_test.customers values(null,'万华','F','长沙市','芙蓉区');
最后,在命令行输入下面sql语句验证触发器
select @str;
三、删除触发器
drop trigger if exists mysql_test.customers_insert_trigger;
注意:当删除一个表的同时,也会自动地删除该表上的触发器。另外,触发器不能更新或覆盖,如果要修改触发器,必须先删除它,再重新创建。
四、使用触发器
1.insert触发器
在insert触发器代码内,可引用一个名为new(不区分大小写)的虚拟表,来访问新插入的行,即使是before insert触发器也允许更改被插入的值(只要有相应的权限)。
如插入一条数据时,将用户变量str的值设置为新插入客户的cust_id号:
create trigger mysql_test.customers_insert_trigger after insert on mysql_test.customers for each row set @str=new.cust_id;
2.delete触发器
在delete触发器代码内,可以引用一个名为old(不区分大小写)的虚拟表,来访问被删除的行。
3.update触发器
在update触发器的代码内,可以引用new虚拟表,也可以引用old虚拟表,其中要注意的是old中的值全部是只读的,不能被更新。
如每次更新表customers时,将该表中cust_address列的值设置为原数据中cust_contact列的值。
create trigger mysql_test.customers_update_trigger before update on mysql_test.customers for each row set new cust_address=old.cust_contact;
更新一条数据 ,测试一下
update mysql_test.customers set cust_address='武汉市' where cust_name='张三';
最后,在命令行输入以下sql语句,会发现“张三”的cust_address的值并非“武汉市”,而是被触发器更新为原表中cust_contact列对应的值。
五、对触发器的进一步说明
- 触发器的执行是自动的
- 应该多用触发器来保证数据的一致性,完整性和正确性。
- 触发器不支持call语句,所以不能直接存储过程,只有手工地将所需的存储过程代码复制到触发器内。