MySQL 之触发器(创建/修改、删除CREATE/DROP TRIGGER) (2)

与触发器相关联的表名,此表必须是永久性表,不能将触发器与临时表或视图关联起来。在该表上触发事件发生时才会激活触发器。同一个表不能拥有两个具有相同触发时刻和事件的触发器。例如,对于一张数据表,不能同时有两个 BEFORE UPDATE 触发器,但可以有一个 BEFORE UPDATE 触发器和一个 BEFORE INSERT 触发器,或一个 BEFORE UPDATE 触发器和一个 AFTER UPDATE 触发器。

5) 触发器主体

触发器动作主体,包含触发器激活时将要执行的 MySQL 语句。如果要执行多个语句,可使用 BEGIN…END 复合语句结构。

6) FOR EACH ROW

一般是指行级触发,对于受触发事件影响的每一行都要激活触发器的动作。例如,使用 INSERT 语句向某个表中插入多行数据时,触发器会对每一行数据的插入都执行相应的触发器动作。

注意:每个表都支持 INSERT、UPDATE 和 DELETE 的 BEFORE 与 AFTER,因此每个表最多支持 6 个触发器。每个表的每个事件每次只允许有一个触发器。单一触发器不能与多个事件或多个表关联。

另外,在 MySQL 中,若需要查看数据库中已有的触发器,则可以使用 SHOW TRIGGERS 语句。

创建 BEFORE 类型触发器

在 test_db 数据库中,数据表 tb_emp8 为员工信息表,包含 id、name、deptId 和 salary 字段,数据表 tb_emp8 的表结构如下所示。

MySQL 之触发器(创建/修改、删除CREATE/DROP TRIGGER)

MySQL 之触发器(创建/修改、删除CREATE/DROP TRIGGER)

【实例 1】创建一个名为 SumOfSalary 的触发器,触发的条件是向数据表 tb_emp8 中插入数据之前,对新插入的 salary 字段值进行求和计算。输入的 SQL 语句和执行过程如下所示。

MySQL 之触发器(创建/修改、删除CREATE/DROP TRIGGER)

触发器 SumOfSalary 创建完成之后,向表 tb_emp8 中插入记录时,定义的 sum 值由 0 变成了 1500,即插入值 1000 和 500 的和,如下所示。

MySQL 之触发器(创建/修改、删除CREATE/DROP TRIGGER)

 说明:必须先创建表,然后再创建表对应的BEFORE TRIGGER触发器,此触发器才会生效,否则不生效;

创建 AFTER 类型触发器

在 test_db 数据库中,数据表 tb_emp6 和 tb_emp7 都为员工信息表,包含 id、name、deptId 和 salary 字段,数据表 tb_emp6 和 tb_emp7 的表结构如下所示。

MySQL 之触发器(创建/修改、删除CREATE/DROP TRIGGER)

【实例 2】创建一个名为 double_salary 的触发器,触发的条件是向数据表 tb_emp6 中插入数据之后,再向数据表 tb_emp7 中插入相同的数据,并且 salary 为 tb_emp6 中新插入的 salary 字段值的 2 倍。输入的 SQL 语句和执行过程如下所示。

MySQL 之触发器(创建/修改、删除CREATE/DROP TRIGGER)

MySQL 之触发器(创建/修改、删除CREATE/DROP TRIGGER)

 注意:

1、当表设置了FOREIGN KEY 约束条件时,在INSERT INTO 数据时会报错“Mysql错误1452 - Cannot add or update a child row: a foreign key constraint fails”;

解决方法:删除外键约束

ALTER TABLE <表名>

DROP FOREIGN KEY <外键约束名>

2、当表设置了PRIMARY KEY约束条件时,必须要设置auto_increment特性,否则在插入数据时会报错“ERROR 1062 (23000): Duplicate entry \'3\' for key \'PRIMARY\'”;

3、当设置了auto_increment特性时,当使用INSERT INTO 插入数据失败时,系统的KEY ID会默认增加,当再次插入数据成功后,用SELECT * FROM <表名>会发现ID不会呈现连续状态;

三、MySQL修改和删除触发器(DROP TRIGGER)

修改触发器可以通过删除原触发器,再以相同的名称创建新的触发器。

基本语法

与其他MySQL数据库对象一样,可以使用 DROP 语句将触发器从数据库中删除。

语法格式如下:

DROP TRIGGER [ IF EXISTS ] [数据库名] <触发器名>

语法说明如下:

1) 触发器名

要删除的触发器名称。

2) 数据库名

可选项。指定触发器所在的数据库的名称。若没有指定,则为当前默认的数据库。

3) 权限

执行 DROP TRIGGER 语句需要 SUPER 权限。

4) IF EXISTS

可选项。避免在没有触发器的情况下删除触发器。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgzdgj.html