触发器是个特殊的存储过程,不同的是,执行存储过程要用CALL语句来调用,但触发器是不需要CALL语句调用,也不用手动启动,只是当一个预定义的时间发生的时候,就会被MySQL自动调用。就像火警装置一样,一出现大火浓烟就会响起报警的声音,这个触发条件是火和浓烟。
创建触发器的执行语句是:
create trigger 触发器名字 触发器的时间 触发的事件 on 建立触发器的表名 for each row 触发器的执行语句;
其中触发器的时间包括before或after;触发事件包括insert,update,delete
1、在表上建立一个触发器
######创建一个表######
create table a(sno int,id int);
######创建一个名为a_trg的触发器,在插入数据的时候求出总和######
create trigger a_trg before insert on a for each row set @sum = @sum + new.id;
######初始化sum变量为0######
set @sum = 0;
######向a表中插入数据######
insert into a values(1,001),(2,002),(3,003);
######查询######
select @sum;
+------+
| @sum |
+------+
| 6 |
+------+
2、在表上建立多个触发器
######创建a1表######
create table a1(v1 int);
######创建a2表######
create table a2(v2 int);
######创建a3表######
create table a3(v3 int not null auto_increment primary key);
######创建a4表######
create table a4(v4 int not null auto_increment primary key,
-> w4 int default 0
-> );
######修改SQL语句的结束符为//(默认为;)
delimiter //
######创建一个名为a_trigger的触发器######
create trigger a_trigger before insert on a1
-> for each row
-> begin ######开始执行语句######
-> insert into a2 set v2 = new.v1; ######将a1表里新插入的数据插入到a2表里
-> delete from a3 where v3 = new.v1; ######删除a3表里的和a1表新插入数据一样的数据######
-> update a4 set w4 = w4 + 1 where v4 = new.v1;######把a4表里的跟a1一样的数据都加1######
-> end ######结束######
-> // ######这个触发器的SQL语句结束######
delimiter ; ######修改SQL结束语句为;######
######给下面各个表插入数据,a1表的数据最后插入,以便启动触发器######
insert into a3 values(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL);
insert into a4(v4) values(0),(0),(0),(0),(0),(0),(0),(0),(0),(0);
insert into a1 values(1),(3),(1),(4),(5),(2),(0),(0);
查询4个表的数据
MariaDB [wen]> select * from a1;
+------+
| v1 |
+------+
| 1 |
| 3 |
| 1 |
| 4 |
| 5 |
| 2 |
| 0 |
| 0 |
+------+
8 rows in set (0.00 sec)
MariaDB [wen]> select * from a2;
+------+
| v2 |
+------+
| 1 |
| 3 |
| 1 |
| 4 |
| 5 |
| 2 |
| 0 |
| 0 |
+------+
8 rows in set (0.00 sec)
MariaDB [wen]> select * from a3;
+----+
| v3 |
+----+
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
+----+
5 rows in set (0.00 sec)
MariaDB [wen]> select * from a4;
+----+------+
| v4 | w4 |
+----+------+
| 1 | 2 |
| 2 | 1 |
| 3 | 1 |
| 4 | 1 |
| 5 | 1 |
| 6 | 0 |
| 7 | 0 |
| 8 | 0 |
| 9 | 0 |
| 10 | 0 |
+----+------+
10 rows in set (0.00 sec)
3、查看触发器
show triggers \G
select * from information_schema.triggers \G
4、删除触发器(DROP TRIGGER 触发器的名字)
drop trigger a_trigger;