mysql 触发器
官网说明如下:
触发器是与表关联的命名数据库对象,并在表发生特定事件时激活。触发器的一些用途是执行对要插入表中的值的检查,或者对更新中涉及的值执行计算。
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。触发器定义为在语句插入,更新或删除关联表中的行时激活。这些行操作是触发事件。例如,可以通过 INSERT
或LOAD DATA
语句插入行,并为每个插入的行激活插入触发器。可以将触发器设置为在触发事件之前或之后激活。例如,您可以在插入表中的每一行之前或更新的每一行之后激活一个触发器。
创建触发器语法
1 CREATE 2 [DEFINER = user] 3 TRIGGER trigger_name 4 trigger_time trigger_event 5 ON tbl_name FOR EACH ROW 6 [trigger_order] 7 trigger_body 8
9 trigger_time: { BEFORE | AFTER } 10
11 trigger_event: { INSERT | UPDATE | DELETE } 12
13 trigger_order: { FOLLOWS | PRECEDES } other_trigger_name
trigger_name :是触发器名称
trigger_time
是触发动作时间。它可以是BEFORE
或 AFTER
表示触发器在每行要修改之前或之后激活。
trigger_event
表示激活触发器的操作类型。trigger_event
允许这些 值:
-
INSERT
:只要在表中插入新行,触发器就会激活; 例如,通过INSERT
,LOAD DATA
和REPLACE
语句。 -
DELETE
:只要从表中删除行,触发器就会激活; 例如,通过DELETE
和REPLACE
陈述。DROP TABLE
并且TRUNCATE TABLE
表上的语句不会激活此触发器,因为它们不使用DELETE
。删除分区也不会激活DELETE
触发器。
它trigger_event
不代表激活触发器的文字类型的SQL语句,因为它表示一种表操作。例如, INSERT
触发器不仅激活INSERT
语句而且 激活LOAD DATA
语句,因为两个语句都将行插入表中。
一个可能令人困惑的例子是INSERT INTO ... ON DUPLICATE KEY UPDATE ...
语法: BEFORE INSERT
触发器为每一行激活,后跟AFTER INSERT
触发器或两者BEFORE UPDATE
和AFTER UPDATE
触发器,具体取决于行是否有重复的键。
注意
级联外键操作不会激活触发器。 触发器不能用于 或用于 引用生成的列。
trigger_body
是触发器激活时要执行的语句。 要执行多个语句,请使用 BEGIN ... END
复合语句构造
1 CREATE TRIGGER upd_check BEFORE UPDATE ON account 2 FOR EACH ROW 3 BEGIN 4 IF NEW.amount < 0 THEN 5 SET NEW.amount = 0; 6 ELSEIF NEW.amount > 100 THEN 7 SET NEW.amount = 100; 8 END IF; 9 END;//
1 /*创建一张表*/ 2 CREATE TABLE account ( 3 acct_num INT, 4 amount DECIMAL(10,2) 5 );
创建触发器
1 CREATE TRIGGER ins_sum 2 BEFORE INSERT 3 ON account 4 FOR EACH ROW 5 SET @sum = @sum + NEW.amount;
设置变量值为0
SET @sum = 0;
插入语句时 执行触发器
INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,-100.00);
语句执行@sum
后 的值INSERT
是 14.98 + 1937.50 - 100
,或 1852.48
。
SELECT @sum AS 'Total amount inserted';
