MySQL----触发器

触发器是由MySQL的基本命令事件来触发某种特定操作,这些基本的命令由INSERT、UPDATE、DELETE等事件来触发某些特定操作。满足触发器的触发条件时,数据库系统就会自动执行触发器中定义的程序语句,可以令某些操作之间的一致性得到协调。

创建MySQL触发器

在MySQL中,创建只有一条执行语句的触发器的基本形式如下:

CREATE TRIGGER 触发器名 BEFORE | AFTER 触发事件 ON 表名 FOR EACH ROW 执行语句

具体参数说明如下:

  • 1 触发器名指定要创建的触发器的名字
  • 2 参数BEFORE 和 AFTER 指定触发器执行的时间。BEFORE指在触发时间之前执行触发语句;AFTER表示在触发时间之后执行出发语句。
  • 3 触发时间参数指数据库操作触发条件,其中包括INSERT、UPDATE和DELETE。
  • 4 表名指定触发时间操作表的名称
  • 5 FOR EACH ROW 表示任何一条记录上的操作满足触发事件都会触发改触发器。
  • 6 执行语句指触发器被出发执行的程序。

示例:创建一个由插入命令INSERT触发的触发器auto_save_timie

1 创建一个名称为timelog的表格:

create table timelog(

id int(11) primary key auto_increment not null,savetime varchar(50) not null

);

2 创建一个名称为auto_save_time的触发器

delimiter //

create trigger_auto_save_time before insert

on student info for each row

insert into jtimelog(savetime) values(now());

//

auto_save_time触发器创建成功,其具体的功能是当用户向studentinfo表中执行INSERT操作时,数据库系统自动在插入语句执行之前像timelog表中插入当前时间。

下面通过向studentinfo表插入一条信息来看触发器的作用,其代码如下所示:

insert into studentinfo(name) values(Chris);

接着查看timelog表中是否进行INSERT操作。

创建具有多条执行语句的触发器

CREATE TRIGGER 触发器名称 BEFORE | AFTER 触发事件
ON 表名 FOR EACH ROW
BEGIN
执行语句列表
END

其中,创建具有多条执行语句触发器的语法结构与创建触发器的一般语法结构大体相同,参数的释义可以看前面的解释说明。在该结构中,将要执行的多条语句放入BEGIN与END之间。多条语句需要执行的内容,需要用分隔符";"隔开。

说明
一般放在BEGIN与END之间的多条执行语句必须用结束分隔符“;”分开。在创建触发器过程中需要更改分隔符,故这里应用第14章提到的DELIMITERT语句,将结束符号变为“//”。当触发器创建完成后,读者同样可以应用该语句将结束符换回“;”。

示例:

模拟一个由DELETE触发多条执行语句的触发器delete_time_info。模拟一个日志数据表和一个删除时间表。当用户删除数据库中的某条记录后,数据库系统会自动向日志表中写入日志信息。创建具有多条执行语句的触发器的过程如下:

create table timeinfo(

id int(11) primary key auto_increment,

info varchar(50) not null

)//

创建一个由DELETE触发多条执行语句的触发器delete_time_info,其代码如下:

delimiter//

create trigger delete_time_info after delete

on studentinfo for each row

begin

insert into timelog(savetime) values(now());

insert into timeinfo(info) values('deleteact');

end

//

在触发器创建成功之后,timelog与timeinfo表中将会插入两条相关记录。执行删除操作的代码如下:

delete from studentinfo where sid = 7;

删除成功后,应用SELECT语句分别查询timelog和timeinfo表中将会插入两条相关的记录

DELETE FROM studentinfo where sid=7;

删除成功之后,应用SELECT语句分别查看数据表timelog与数据表timeinfo。

说明

在MySQL中,一个表在相同的时间和相同的触发时间只能创建一个触发器,如触发时间INSERT,触发时间为AFTER的触发器只能有一个。但是可以定义BEFORE的触发器。

查看触发器

查看触发器是指查看数据库中已经存在的触发器的定义、状态和语法等信息。查看触发器应用SHOW TRIGGERS语句。

1 SHOW TRIGGERS

在MySQL中,可以执行SHOW TRIGGERS语句查看触发器的基本信息,其基本形式如下:

SHOW TRIGGERS;

进入MySQL数据库,选择students数据库并查看该数据库中存在的触发器。

在命令提示符中输入SHOW TRIGGERS语句即可查看选择数据库中的所有触发器,但是,应用该查看语句存在一定弊端,即只能查询所有触发器的内容,并不能指定查看某个触发器的信息。这样一来,就会在用户查找指定触发器信息的时候带来极大不便。故推荐读者只在触发器数量较少的情况下应用SHOW TRIGGERS语句查询触发器基本信息。

查看triggers表中的触发器的信息

在MySQL中,所有触发器的定义都存在该数据库的triggers表中。读者可以通过查询triggers表来查看数据库中所有触发器的详细信息。查询语句如下所示。

SELECT * FROM information_schema.triggers;

其中,information_schema是MySQL中默认存在的库,而information_schema是数据库中用于触发器信息的数据表。

通过SELECT语句查看触发器信息。但是如果用户想要查看某个指定触发器的内容,可以通过WHERE子句应用TRIGGER字段作为查询条件。其代码如下:

SELECT * FROM information_schema.triggers WHERE TRIGGER_NAME=‘触发器名称’;

其中,"触发器名称"这一参数为用户指定要查看的触发器名称,和其他SELECT语句相同,该名称内容需要用一对“''”(单引号)引用指定的文字内容。

说明

如果数据库中存在数量较多的触发器,建议读者使用第二种查看触发器的方式。这样会在查找指定触发器过程中避免很多麻烦。

使用触发器

在MySQL中,触发器按以下顺序执行:BEFORE触发器、表操作、AFTER触发器操作、其中表操作包括常用的数据库作命令(如INSERT、UPDATE、DELETE)。

触发器与表操作存在执行顺序,下面通过创建一个示例向读者展示三者的执行顺序关系。

1 创建名称为before_in的BEFORE INSERT触发器,其代码如下:

create trigger before_in before insert on 

studentinfo for each row

insert into timeinfo (info) values ('before');

2 创建名称为after_in的AFTER INSERT触发器,其代码如下:

create trigger after_in after insert on

studentinfo for each row

insert into timeinfo (info) values('after');

3 创建完毕触发器,向数据表studentinfo中插入一条记录:

insert into studentinfo(name) values('Nowitzki');

插入成功后,可以通过SELECT语句查看timeinfo的插入情况:

select * from timeinfo;

说明:

触发器不能包含START TRANSCATION、COMMIT或ROLLBACK等关键字,也不能包含CALL语句。触发器执行非常严密,每一环嘻嘻相关,任何错误都可能导致程序无法向下执行。已经更新过的数据表是不能回滚的,故设计过程中一定要注意触发器的逻辑严密性。

删除触发器

在MySQL中,既然可以创建触发器,同样也可以通过命令删除触发器。删除触发器指删除原来已经在某个数据库中创建的触发器,与MySQL中删除数据库的命令相似,应用DROP关键字触发器。其语法结构如下:

DROP TRIGGER 触发器名称

"触发器名称"参数为用户指定要删除的触发器名称,如果指定某个特定的触发器名称,MySQL在执行过程中将会在当前库中查找触发器。

说明

在应用完触发器后,切记一定要将触发器删除,否则在执行某些数据库操作时,会造成数据库的变化。

删除名称为delete_time_info的触发器

DROP TRIGGER delete_time_info; 

通过查看触发器的命令来查看数据库students的触发器信息

show triggers

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值