mysql触发器的实例详解
Posted Jack小强
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql触发器的实例详解相关的知识,希望对你有一定的参考价值。
1、创建触发器
a基本语法应用
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、LOAD DATA、REPLACE
tbl_name:标识建立触发器的表名,即在哪张表上建立触发器;
trigger_stmt:触发器程序体,可以是一句SQL语句,或者用 BEGIN 和 END 包含的多条语句。
b语法详解
DELIMITER $
create trigger tri_stuInsert after insert
on student for each row
begin
declare c int;
set c = (select stuCount from class where classID=new.classID);
update class set stuCount = c + 1 where classID = new.classID;
end$
DELIMITER ;
①trigger_event参数详解
LOAD DATA 语句用于将一个文件装入到一个数据表中,相当与一系列的 INSERT 操作。
REPLACE 语句一般来说和 INSERT 语句很像,只是在表中有 primary key 或 unique 索引时,如果插入的数据和原来 primary key 或 unique 索引一致时,会先删除原来的数据,然后增加一条新数据,也就是说,一条 REPLACE 语句有时候等价于一条。INSERT 语句,有时候等价于一条 DELETE 语句加上一条 INSERT 语句。
INSERT 型触发器:插入某一行时激活触发器,可能通过 INSERT、LOAD DATA、REPLACE 语句触发;
UPDATE 型触发器:更改某一行时激活触发器,可能通过 UPDATE 语句触发;
DELETE 型触发器:删除某一行时激活触发器,可能通过 DELETE、REPLACE 语句触发。
②BEGIN … END 详解
BEGIN
[statement_list]
END
statement_list 代表一个或多个语句的列表,列表内的每条语句都必须用分号(;)来结尾。
注意:在mysql某些版本中,由于分号是语句结束的标识符,遇到分号表示该段语句已经结束,MySQL便会立即开始执行。所以,解释器遇到statement_list 中的分号后会报出错误,因为没有找到和 BEGIN 匹配的 END。
这时就会用到 DELIMITER 命令,它是一条命令,不需要语句结束标识
DELIMITER new_delemiter
例:DELIMITER $
new_delemiter 可以设为1个或多个长度的符号,默认的是分号(;)
DELIMITER
之后的语句,以分号结束,解释器不会有什么反应,只有遇到了
,才认为是语句结束。使用完之后,我们还应该记得把它给修改回来。
③DECLARE变量详解
DECLARE 用来定义一局部变量,该变量只能在 BEGIN … END 复合语句中使用,并且应该定义在复合语句的开头,
DECLARE var_name[,...] type [DEFAULT value]
例:declare c int;
var_name 为变量名称,同 SQL 语句一样,变量名不区分大小写;
type 为 MySQL 支持的任何数据类型;可以同时定义多个同类型的变量,用逗号隔开;
SET var_name = expr [,var_name = expr]
例:set c = (select stuCount from class where classID=new.classID);
变量初始值为 NULL,如果需要,可以使用 DEFAULT子句提供默认值,值可以被指定为一个表达式。
④NEW 与 OLD 详解
NEW.columnName
columnName 为相应数据表某一列名
在 INSERT 型触发器中,NEW 用来表示将要(BEFORE)或已经(AFTER)插入的新数据;
在 UPDATE 型触发器中,OLD 用来表示将要或已经被修改的原数据,NEW 用来表示将要或已经修改为的新数据;
在 DELETE 型触发器中,OLD 用来表示将要或已经被删除的原数据;
注意:OLD 是只读的,而 NEW 则可以在触发器中使用 SET 赋值,这样不会再次触发触发器,造成循环调用(如每插入一个学生前,都在其学号前加“2013”)。
2、查看触发器
SHOW TRIGGERS [FROM schema_name];
schema_name 即 Schema 的名称
3、删除触发器
DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name
和删除数据库、删除表格一样
4、触发器的执行顺序
①如果 BEFORE 触发器执行失败,SQL 无法正确执行。
②SQL 执行失败时,AFTER 型触发器不会触发。
③AFTER 类型的触发器执行失败,SQL 会回滚。
5、简单实例
a创建表
DROP TABLE IF EXISTS tab1;
CREATE TABLE tab1(
tab1_id varchar(11)
);
DROP TABLE IF EXISTS tab2;
CREATE TABLE tab2(
tab2_id varchar(11)
);
b创建触发器:t_afterinsert_on_tab1
作用:增加tab1表记录后自动将记录增加到tab2表中
DROP TRIGGER IF EXISTS t_afterinsert_on_tab1;
CREATE TRIGGER t_afterinsert_on_tab1
AFTER INSERT ON tab1
FOR EACH ROW
BEGIN
insert into tab2(tab2_id) values(new.tab1_id);
END;
测试一下
INSERT INTO tab1(tab1_id) values('0001');
SELECT * FROM tab1;
SELECT * FROM tab2;
c创建触发器:t_afterdelete_on_tab1
作用:删除tab1表记录后自动将tab2表中对应的记录删去
DROP TRIGGER IF EXISTS t_afterdelete_on_tab1;
CREATE TRIGGER t_afterdelete_on_tab1
AFTER DELETE ON tab1
FOR EACH ROW
BEGIN
delete from tab2 where tab2_id=old.tab1_id;
END;
测试一下
DELETE FROM tab1 WHERE tab1_id='0001';
SELECT * FROM tab1;
SELECT * FROM tab2;
以上是关于mysql触发器的实例详解的主要内容,如果未能解决你的问题,请参考以下文章