目录
1、创建触发器
1、创建只有一个执行语句的触发器
2、创建有多个执行语句的触发器
2、查看触发器
1、通过SHOW TRIGGERS查看触发器:
2.在triggers 表中查看触发器信息
3、使用触发器
4、删除触发器
1、创建触发器
MySQL 的触发器和存储过程一样,都是嵌入到 MySQL的一段程序。
触发器是由事件来触发某个操作,这些事件包括INSERT、UPDATAE和DELETE语句。
如果定义了触发程序,当数据库执行这些语句的时候就会激发触发器执行相应的操作,
触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。
触发器(trigger)是个特殊的存储过程,不同的是,执行存储过程要使用CALL语句来调用, 而触发器的执行不需要使用 CALL 语来调用,也不需要手工启动,只要当一个预定义的
事件发生的时候就会被MySQL自动调用。比如当对fuits表进行操作(INSERT DELETE
或UPDATE)时就会激活它执行。
触发器可以查询其他表,而且可以包含复杂的 SQL 语句。
它们主要用于满足复杂的业务规则或要求。
例如:可以根据客户当前的账户状态,控制是否允许插入新订单。
1、创建只有一个执行语句的触发器
创建一个触发器的语法如下:
CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt
其中
trigger_name标识触发器名称,用户自行指定;
trigger_time 标识触发时机,可以指定为 before 或after;
trigger_event 标识触发事件包括 INSERT UPDATE 和 DELETE;
tbl_name标识建立触发器的表名,即在哪张表上建立触发器;
trigger_stmt 是触发器执行语句。
举例:创建一个单执行语句的触发器,代码如下:
create table account (acct_num int,amount decimal(10,2)); /*建立一个临
时账号表*/
create trigger ins_sum before insert
on account
for each row set @sum=@sum+new.amount;
首先创建一个account表,表中有两个字段,分别为:acct_num字段(定义为int类型),
amount 字段(定义成浮点类型):其次创建一个名为 ins_sum 的触发器, 触发的条件是向数据表account插入数据之前,对新插入的amount字段值进行求和计算。
测试一下:
set @sum=0;
insert into account values(1,123.12),(2,321.21);
select @sum;
2、创建有多个执行语句的触发器
创建多个执行语句的触发器的语法如下:
CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW
BEGIN
语句执行列表
END
其中 trigger_name标识触发器的名称,用户自行指定;trigger_time标识触发时机,
可以指定为 before 或after;trigger_event 标识触发事件,包括INSERT、UPDATE和
DELETE:
tbl_name标识建立触发器的表名,即在哪张表上建立触发器:
触发器程序可以使用BEGIN和END作为开始和结束,中间包含多条语句。
举例:创建一个包含多个执行语句的触发器,代码如下:
创建表
create table test1(a1 int);
create table test2(a2 int);
create table test3(a3 int not null AUTO_INCREMENT primary key);
create table test4(
a4 int not null AUTO_INCREMENT primary key,
b4 int default 0
);
创建触发器
delimiter //
create trigger testref before insert on test1
for each row
begin
insert into test2 set a2 = new.a1;
delete from test3 where a3 = new.a1;
update test4 set b4=b4+1 where a4=new.a1;
end //
delimiter ;
初始化一些数据
INSERT INTO test3 (a3) VALUES
(NULL),(NULL),(NULL),(NULL),(NULL),
(NULL),(NULL),(NULL),(NULL),(NULL);
INSERT INTO test4 (a4) VALUES (0),(0),(0),(0),(0), (0),(0),(0),(0),(0);
上面的代码是创建了一个名为 testref 的触发器,
这个触发器的触发条件是在向表 test1插入数据前执行触发器的语句,
具体执行的代码如下:
开始前:
执行如下插入操作,会自动触发触发器完成test2,test3,test4 表的自动变更。
insert into test1 values (1),(3),(1),(7),(1),(8),(4),(4);
那么4个表中数据如下:
执行结果显示,在向表test1 插入记录的时候,test2、test3、test4 都发生了变化。
从这个例子看INSERT触发了触发器,向 test2 中插入了 test1 中的值,
删除了test3 中相同的内容同时更新了test4中的b4,即与插入的值相同的个数。
查看触发器是指查看数据库中已存在的触发器的定义、状态和语法信息等。
2、查看触发器
可以通过命令来查看已经创建的触发器。
两种查看触发器的方法,分别是:SHOW TRIGGERS 和在triggers表中查看触发器信息。
1、通过SHOW TRIGGERS查看触发器:
show triggers;
通过SHOW TRIGGERS命令查看一个触发器,代码如下:
show triggers \G;
创建一个简单的触发器,名称为 trig_update,每次向account表更新数据之后都会向
名称为myevent的数据表中插入一条记录,数据表myevent定义如下:
create table myevent
(
id int(11) default null,
evt_name char(20) default null
);
创建触发器的执行代码如下
create trigger trig_update before insert on account
for each row
insert into myevent values (1,'after update');
使用SHOW TRIGGERS \G 命令查看触发器
Trigger表示触发器的名称 在这里两个触发器的名称分别为ins_sum和trig_update;
Event表示激活触发器的事件 这里的两个触发事件为插入操作INSERT 和更新操作
UPDATE;
Table表示激活触发器的操作对象表,这里都为 account表;Timing表示触发器触发的时
间,
分别为插入操作之前(BEFORE和更新操作之后(AFTER);Statement 表示触发器执行的
操作
还有一些其他信息,比如 SQL 的模式、触发器的定义账户和字符集等,这里不再一一
介绍。
2.在triggers 表中查看触发器信息
在MySQL中所有触发器的定义都存在INFORMATION_SCHEMA数据库的
TRIGGERS表格中,
可以通过查询命令SELECT来查看,具体的语法如下:
SELECT FROM INFORMATION_SCHEMA.TRIGGERS WHERE Condit1on;
举例:
select * from INFORMATION_SCHEMA.TRIGGERS where TRIGGER_NAME= 'ins_sum'\G;
从上面的执行结果可以得到:TRIGGER_SCHEMA 表示触发器所在的数据库;
TRIGGER_NAME 后面是触发器的名称,
EVENT_OBJECT_TABLE表示在哪个数据表上触 发
ACTION_STATEMENT表示触发器触发的时候执行的具体操作
ACTION_ORIENTATION是ROW,表示在每条记录上都触发:
ACTION_TIMING表示触发的时刻是 AFTER,剩下的是和系统相关的信息。
也可以不指定触发器名称,这样将查看所有的触发器,命令如下:
select * from INFORMATION_SCHEMA.TRIGGERS \G;
这个命令会显示这个TRIGGERS表中所有的触发器信息。
3、使用触发器
使用触发器:
触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。
在某些触发程序的用法中,可用于检查插入到表中的值,或对更新涉及的值进行计算。
触发程序与表相关,当对表执行INSERT、DELETE或UPDATE语句时,将激活触发程序。
可以将触发程序设置为在执行语句之前或之后激活。
例如,可以在从表中删除每一行之前或在更新每一行之后激活触发程序。
创建一个在account 表插入记录之后,更新myevent 数据表的触发器,代码如下:
create table myevent (id int, log text);
create trigger trig_insert after insert
on account
for each row
insert into myevent values(2,'after insert');
上面的代码创建了一个trig_insert的触发器在向表account插入数据之后会向表myevent
插入一组数据,代码执行如下:
insert into account values (1,1.00), (2,2.00);
select * from myevent;
从执行的结果来看,是创建了一个名称为 trig insert 的触发器,
它是在向account 插入记录之后进行触发,执行的操作是向表myevent插入一条记录。
4、删除触发器
使用DROP TRIGGER 语句可以删除MySQL中已经定义的触发器
删除触发器语句基本语法格式如下:
DROP TRIGGER [schema_name.] trigger_name
其中,schema_name表示数据库名称,是可选的。如果省略了schema,
将从当前数据库中舍弃触发程序;trigger_name 是要删除的触发器的名称。
举例:删除一个触发器,代码如下:
DROP TRIGGER test.ins;
上面的代码中test 是触发器所在的数据库,ins 是一个触发器的名称。代码执行如下:
drop trigger test.trig_insert;
触发器trig_insert删除成功。
查询确认已经删除:
show triggers \G;
注意事项:
疑问1:使用触发器时须特别注意
在使用触发器的时候需要注意,对于相同的表,相同的事件只能创建一个触发器,
比如对表account创建了一个BEFORE INSERT触发器那么如果对表account再次
创建一个BEFORE INSERT触发器,MySQL将会报错,此时,只可以在表account
上创建AFTER INSERT或者BEFORE UPDATE类型的触发器。灵活地运用触发器将为操作省去很多麻烦。
疑问2:及时删除不再需要的触发器
触发器定义之后,每次执行触发事件,都会激活触发器并执行触发器中的语句。如果需求发生变化,而触发器没有进行相应的改变或者删除,则触发器仍然会执行旧的语句,从而会影响新的数据的完整性。因此,要将不再使用的触发器及时删除。
练习题:
(1)创建INSERT事件的触发器
create table a (id int, yeat int);
create table a1 (id int, log text);
select * from a1;
create trigger trig_a1 after insert
on a
for each row
insert into a1 values(2,'after insert');
insert into a values (1,100), (2,200);
select * from a1;
(2)创建UPDATE事件的触发器。
create trigger trig_a2 after update
on a
for each row
insert into a1 values(3,'after insert');
update a
set id = 2, yeat=100
where id = 2;
select * from a1;
(3)创建DELETE事件的触发器。
create trigger trig_a3 after delete
on a
for each row
insert into a1 values(4,'after insert');
delete from a where id = 2;
select * from a1;
(4)查看触发器,并使用触发器。
show triggers \G;
select * from INFORMATION_SCHEMA.TRIGGERS where TRIGGER_NAME= 'trig_a2'\G;
(5)删除触发器。
drop trigger trig_a3;
select * from INFORMATION_SCHEMA.TRIGGERS where TRIGGER_NAME= 'trig_a3'\G;