Myslq触发器-自动生成业务编码

MySQL触发器

**概述:**MySQL触发器是一种特殊类型的数据库对象,必须和表关联,并在表上执行操作或逻辑。例如增,删,改;

**实际场景:**我最近使用触发器的场景是自动生成编码,编码规则是这样的:固定编码 + 变量 + 自增流水号,其中自增流水号是由日期+5位自增序列号。可以通过java来实现,每次生成编码时需要查询数据库中的数据,这样如果两个人同事生成编码会不会出问题呢?这点我没办法保证数据的唯一性,于是采用了触发器的方式。可能会有BUG,也希望大神多多请教~ ~ 话不多说直接上代码!!!

-- 1.添加自增序列表 缺陷:每日重置序列 需要设置MySQL事件,定时任务重置序列号
-- Orcalr 支持自定义序列的,但是MySQL暂时不支持所以采用创建序列表的方式
CREATE TABLE code_sequence (
  seq INT NOT NULL
);

INSERT INTO code_sequence VALUES (1);

-- 2.创建触发器  
DELIMITER //
-- generate_code_trigger 触发器名称
CREATE TRIGGER generate_code_trigger
-- 在插入之前执行 绑定 code_table 表
BEFORE INSERT ON code_table
-- 对每一行都进行操作
FOR EACH ROW
-- 开始触发器逻辑
BEGIN
	-- 声明变量 下一个序列号,变量值,当前日期
    DECLARE nextSeq INT;
    DECLARE codePrefix VARCHAR(255);
    DECLARE currentDate VARCHAR(10);
    
    -- 获取字符串变量(变量名称按照实际情况修改)
    SET codePrefix = NEW.string_variable;
    
    -- 获取当前日期(YYMMDD时间格式)
    SET currentDate = DATE_FORMAT(NOW(), '%y%m%d');
    
    -- 获取下一个序列号,获取期间锁定该行数据
    SELECT seq INTO nextSeq FROM code_sequence FOR UPDATE;
    
    -- 生成code值 LPAD函数,填充左侧字符
    SET NEW.code = CONCAT('P', codePrefix, currentDate, LPAD(nextSeq, 5, '0'));
    
    -- 自增序列号
    UPDATE code_sequence SET seq = seq + 1;
-- 触发器逻辑结束
END//

DELIMITER ;

-- 测试触发器是否成功
INSERT INTO code_table (string_variable) VALUES ('QWE');


-- 定时任务 重置序列号
DELIMITER //

-- 创建事件(定时任务)
CREATE EVENT reset_sequence_event
-- 每日执行一次
ON SCHEDULE EVERY 1 DAY
-- 执行开始时间
STARTS DATE_FORMAT(NOW(), '%Y-%m-%d 00:00:00')
DO
-- 执行逻辑
BEGIN
		-- 重置序列表id
		update  code_sequence set seq = 1;
END//

DELIMITER ;

-- 查询调度器是否启用 OFF-未启用 ON-启用
SHOW VARIABLES LIKE 'event_scheduler';

-- 启用调度器
SET GLOBAL event_scheduler = ON;

运行后截图
在这里插入图片描述

​ **结束语:**以上就是MySQL创建触发器的案例了,还是根据实际业务来决定是否需要触发器,只是作为使用,没有太深入的了解触发器,运用到实际项目中还需要深思熟虑下。希望大家多点赞多评论好人一生平安!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值