触发器的定义:
触发器与编程语言的函数类似,都需要声明、执行等。但是触发器的执行并不是由程序执行的,也不是用户调用的,而是在特定的时候触发。
三种常见的触发方式:insert、uodate、delete,即在插入数据时触发,在更改数据时触发,在删除数据时触发
定义触发器使用trigger关键字
触发器的语法:
(红色为固定写法)
CREATE TRIGGER trigger_name
trigger_time
trigger_event ON tbl_name
FOR EACH ROW
BEGIN
……
END
解析:trigger_name:触发器的名字,类似于函数的名字
trigger_time:触发器触发的时机(可选参数:before,after),after表示先执行SQL语句再执行触发器触发的事件,befo相反
trigger_event:触发器的触发事件(三个常用参数:insert、uodate、delete)
tbl_name:触发器要加入到哪张表
BEGIN和END之间写SQL语句,当触发事件发生时,执行其中的SQL语句
实例:使用触发器,当在a1表中插入数据时,a2表也插入相同的数据(前提:a1,a2表的结构相同)
创建表a1和a2,结构如下:
mysql> create table a1(id int,num int);
Query OK, 0 rows affected (0.03 sec)
mysql> create table a2(id int,num int);
Query OK, 0 rows affected (0.03 sec)
mysql> show columns from a1;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| num | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> show columns from a2;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| num | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)
创建insert触发器a_insert:
mysql> delimiter !! #将语句的结束符号从分号;临时改为两个!!(可以是自定义)
mysql> create trigger a_insert after
-> insert on a1
-> for each row
-> begin
-> insert into a2 set id = new.id,num = new.num;
-> end!!
Query OK, 0 rows affected (0.01 sec)
mysql> delimiter ; #将语句的结束符号恢复为分号
解析:我们创建了一个a_insert触发器,在SQL语句执行完后执行,当在a1中执行插入操作,同时也将数据插入到a2中,我们在定义过程时,使用DELIMITER,使得过程体中使用的分号被直接传递到服务器,而不会被客户端(如mysql)解释(内容中的分号必须要)。
创建测试代码:
mysql> insert into a1(id,num)values(1,4);
Query OK, 1 row affected (0.00 sec)
mysql> select * from a1;
+------+------+
| id | num |
+------+------+
| 1 | 4 |
+------+------+
1 row in set (0.00 sec)
mysql> select * from a2;
+------+------+
| id | num |
+------+------+
| 1 | 4 |
+------+------+
1 row in set (0.00 sec)
解析:当我们在a1中插入数据的时候,触发了触发器,让a2也得到了数据
查看触发器:
语法:SHOW TRIGGERS FROM [库名]
将查出来整个库下面的所有触发器:
show triggers from text(我的a1和a2表放在text库中)
删除触发器:
语法:DROP TRIGGER [库名].[触发器名称]
DROP TRIGGER text.a_insert;