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触发器的实例详解的主要内容,如果未能解决你的问题,请参考以下文章

mysql触发器trigger 实例详解

mysql触发器trigger 实例详解

mysql触发器trigger 实例详解

mysql触发器trigger 实例详解

mysql数据库表之间是怎么关联的?请详解

mysql触发器使日期相加减?