MySQL触发器了解一下
简介
触发器是与表有关的数据库对象,当表发生INSERT/UPDATE/DELETE操作时,对应操作的触发器会被触发,将在这些操作之前或之后执行触发器中定义的SQL语句集合。
触发器的使用
创建触发器
语法:
CREATE
[DEFINER = user]
TRIGGER trigger_name
trigger_time trigger_event
ON tbl_name FOR EACH ROW
[trigger_order]
trigger_body
user:指定在触发器激活时检查访问权限时要使用的MySQL帐户。
trigger_name:触发器名称。
trigger_time:触发动作时间。可以是BEFORE或AFTER,表示触发器在要修改的每一行之前或之后激活。
trigger_event:触发器的类型,可以是INSERT、UPDATE、DELETE。
tbl_name:和触发器关联的表名,必须为一个永久表,不能是视图或者临时表。
trigger_order:指定触发器顺序,取值为FOLLOWS/PRECEDES+触发器名称。(从MySQL 5.7.2开始,可以为表创建具有相同trigger_time和trigger_event的多个触发器,默认顺序是按创建顺序进行激活)
trigger_body:触发器激活时要执行的语句。如果要执行多个语句,需要使用BEGIN ... END复合语句包裹。
示例:
CREATE TRIGGER student_add2 AFTER INSERT ON tb_student
FOR EACH ROW
INSERT INTO tb_new_student (student_id, student_name) VALUES (NEW.id, NEW. NAME);
当在MySQL命令行创建执行多个语句的触发器时,同存储过程一样,也需要修改语句分隔符,如下:
mysql> delimiter //
mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account
FOR EACH ROW
BEGIN
IF NEW.amount < 0 THEN
SET NEW.amount = 0;
ELSEIF NEW.amount > 100 THEN
SET NEW.amount = 100;
END IF;
END;//
mysql> delimiter ;
触发器类型
触发器分为三种类型:INSERT、DELETE、UPDATE。
在触发器主体中,使用OLD和NEW关键字能够访问受触发器影响的行中的列,根据触发器类型的不同,在关键字使用上也有些区别。(OLD和NEW是对MySQL触发器的扩展,它们不区分大小写)
INSERT触发器:当在表中插入新行时,触发器就会激活。插入操作只有新行,所以只有NEW关键字可用,可以通过NEW访问插入的新行数据。
DELETE触发器:当在表中删除一行时,触发器就会激活。删除操作只有旧行,所以只有OLD关键字可用,可以通过OLD访问删除的旧行数据。
UPDATE触发器:当表中一行数据被修改时,触发器就会激活。NEW关键字和OLD关键字都可用,可以通过NEW访问更新后的行数据,通过OLD访问更新前的行数据。
查看触发器定义
语法:
SHOW CREATE TRIGGER trigger_name
示例:
mysql> SHOW CREATE TRIGGER student_add;
+-------------+----------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| Trigger | sql_mode | SQL Original Statement | character_set_client | collation_connection | Database Collation |
+-------------+----------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| student_add | STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | CREATE DEFINER=`root`@`localhost` TRIGGER student_add AFTER INSERT ON tb_student FOR EACH ROW INSERT INTO tb_new_student (student_id, student_name) VALUES (NEW.id, NEW. NAME) | utf8 | utf8_general_ci | utf8_general_ci |
+-------------+----------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
Trigger:触发器名称。
sql_mode:当触发器执行时,SQL模式生效。
SQL Original Statement:触发器的创建语句。
character_set_client:创建触发器时character_set_client系统变量的会话值。
collation_connection:创建触发器时collation_connection系统变量的会话值。
Database Collation:与触发器相关联的数据库的排序。
删除触发器
语法:
DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name
示例:
mysql> DROP TRIGGER student_add;
Query OK, 0 rows affected
注意:如果表被删除,该表的关联的所有触发器也将会被删除。