目录
一、触发器概述
MySQL的触发器和存储过程一样,都是嵌入到MySQL的一段程序。触发器是由时间来触发某个操作,这些时间包括INSERT、UPDATE和DELETE语句。如果定义了触发程序,当数据执行这些语句的时候就会激发触发器执行相应的操作,触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。
触发器(trigger)是一个特殊的存储过程,不同的是,执行存储过程要使用CALL语句来调用,而触发器的执行不需要使用CALL语句调用,也不需要手工启动,只要当一个预定义ide事件发生的时候,就会被MySQL自动调用。
触发器也可以查询其他表,而且可以包含复杂的SQL语句,它们主要用于满足复杂的业务规则或要求。
触发程序优点:
1)触发程序的执行过程是自动的。当触发程序相关表的数据做出相应的修改后立即执行。
2)触发程序可以通过数据库中相关的表进行层叠修改另表的表。
3)触发程序可以实现实施比FOREIGN KEY约束,CHECK约束更为复杂的检查和操作。
二、触发器操作
1、创建触发器
语法
sql
create trigger 触发器名 触发时机<before|after> 触发事件<insert|update|delete>
on 表名 for each row
begin
触发器程序体
end
2、查看触发器
语法1
sql
show triggers;
语法2
sql
select * from INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME='触发器名' \G
3、删除触发器
语法
sql
drop trigger [数据库名.]触发器名
三、触发器应用
例如基于此素材
sql
mysql> create table student(
-> id int auto_increment primary key,
-> name varchar(20)
-> );
Query OK, 0 rows affected (0.03 sec)
mysql> insert into student(name) values ('xiaoming'),('xiaogang');
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from student;
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
+----+----------+
1 row in set (0.00 sec)
mysql> select * from student_total;
+-------+
| total |
+-------+
| 1 |
+-------+
1 row in set (0.00 sec)
1、创建插入触发器,在student表中插入数据,然后studen_total表中自动加一。
sql
mysql> delimiter $$
mysql> create trigger student_insert_trigger after insert
-> on student for each row
-> begin
-> update student_total set total=total+1;
-> end$$
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
2、创建一个删除触发器,在student表中删除数据,然后student_total表的total自动减一。
sql
mysql> delimiter $$
mysql> create trigger student_delete_trigger after delete
-> on student for each row
-> begin
-> update student_total set total=total-1;
-> end$$
Query OK, 0 rows affected (0.02 sec)
mysql> delimiter ;
3、 创建一个更新触发器,在t1表中修改name字段,在t2表自动修改name。
sql
mysql> create table t1(
-> name varchar(20)
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> create table t2(
-> name varchar(20)
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t1 values ('zhangsan'),('lisi');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> insert into t2 values ('zhangsan'),('lisi');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from t1;
+----------+
| name |
+----------+
| zhangsan |
| lisi |
+----------+
2 rows in set (0.00 sec)
mysql> select * from t2;
+----------+
| name |
+----------+
| zhangsan |
| lisi |
+----------+
2 rows in set (0.00 sec)
触发器
sql
mysql> delimiter $$
mysql> create trigger t1_after_uptate_trigger after update
-> on t1 for each row
-> begin
-> update t2 set name=new.name where name=old.name;
-> end $$
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
查看结果
sql
mysql> update t1 set name='zhangsanfeng' where name='zhangsan';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from t2;
+--------------+
| name |
+--------------+
| zhangsanfeng |
| lisi |
+--------------+
2 rows in set (0.00 sec)
mysql> select * from t1;
+--------------+
| name |
+--------------+
| zhangsanfeng |
| lisi |
+--------------+
2 rows in set (0.00 sec)
更多应用需要看实际需求 。