Solo  当前访客:0 开始使用

Nick1407 的个人博客

公众号:JavaCase

触发器的使用


一、触发器
触发器的作用是当表上有对应SQL语句发生时,则触发执行。触发器的分类有行触发器和语句触发器,行级触发器对语句影响的每个行执行一次. 语句级触发器对每个语句执行一次, 如果一条insert语句在一个表中插入多行, 那么这个表的语句级触发器只执行一次, 而行级触发器要执行多次,级联外键操作不会激活触发器。

二、语法
CREATE [DEFINER = user]
TRIGGER trigger_name
trigger_time trigger_event
ON tbl_name
FOR EACH ROW
[trigger_order]
trigger_body

trigger_time: { BEFORE | AFTER }
trigger_event: { INSERT | UPDATE | DELETE }
trigger_order: { FOLLOWS | PRECEDES } other_trigger_name

此语句创建一个新触发器。触发器是与表关联的命名数据库对象,并在表发生特定事件时激活。触发器与名为table的表相关联,该表 _tbl_name_必须引用永久表。无法将触发器与TEMPORARY表或视图相关联 。
模式名称空间中存在触发器名称,这意味着所有触发器必须在模式中具有唯一名称。不同模式中的触发器可以具有相同的名称。
trigger_name:触发器的名称,不能与已经存在的触发器重复;
trigger_time:{ BEFORE | AFTER },表示在事件之前或之后触发;
trigger_event::{ INSERT |UPDATE | DELETE },触发该触发器的具体事件;
tbl_name:该触发器作用在tbl_name上;
trigger_body :表示触发器触发之后要执行的一个或多个语句;
trigger_order:触发器执行顺序;

三、使用示例
1、创建表

CREATE TABLE orders (
	sn_day DECIMAL (32) PRIMARY KEY,
	sn_hours DECIMAL (32),
	sn_minutes DECIMAL (32),
	remark VARCHAR (100)
);

2、创建触发器

CREATE TRIGGER sn_by_day BEFORE INSERT ON orders FOR EACH ROW

BEGIN
	DECLARE
		n  INT;

SELECT
	IFNULL(max(RIGHT(sn_day, 10)), 0) INTO n
FROM
	orders
WHERE
	mid(sn_day, 1, 8) = DATE_FORMAT(NOW(), '%Y%m%d');
 
SET NEW.sn_day = concat(
	DATE_FORMAT(NOW(), '%Y%m%d'),
	RIGHT (10000000001 + n, 10)
);
 

END;

3、触发器说明:
先定义一个变量,叫n,在订单表中查询 sn_day 字段值的1-8位等于当前日期的数据,在这个数据中,取后10位最大的,如果没有,则为0,将这个查询出来的值赋给变量n,将变量n加上10000000001,当然,要加上多少,你可以自己定.主要是为了蹭长度,在当前日期将这个值呢拼接上,然后就生成了一个以当前日期开头的增长序列值,将这个增长序列值存到 sn_day 字段中.

4、新增数据,测试触发器
INSERT orders (remark) VALUES (CONCAT('demo',DATE_FORMAT(NOW(),'%Y-%m-%d %h:%i:%s')));

0 0