MySQL如何生成自增的流水号
作者:三文鱼先生
这篇文章主要介绍了MySQL如何生成自增的流水号问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
MySQL生成自增的流水号
MysSQL生成指定编号
假如我们要生成 类似于 ABCD日期序号 比如
我的购物订单号:SP20211201001,并且以后四位自增,类似于这样的场景,该怎么实现呢?
首先我们分析序号,SP为固定字符,20211201为日期,后面为序号。那么我们要做的第一件事是拼接这三段字符。MySQL中的拼接函数还记得吗?
concat函数
concat的用法
比如
select concat('A', 'B', 'C');
日期相关函数
now()获取当前日期
获取当前日期,用法:
select now();
date_format(日期,指定格式) 格式化日期
格式化日期,用于指定查到的日期格式,比如我们流水号中的年月日,比如:
select date_format(now() , '%Y%m%d');
结果是:
lpad(需填充字符,填充后长度,填充字符串)
select lpad('A' , 4 , 0);
结果
那么现在结果很明显了,我们只需要拼接组合一下即可。
select concat('SP',date_format(now(),'%Y%m%d') , lpad('1' , 4 , 0));
如果需要实现后四位序号自增,该怎么实现?
我们可以先获取购物编号的后四位,+1。然后再执行插入操作。
找出最大序号:
select concat('SP',date_format(now(),'%Y%m%d') , lpad(max(right(shoppingNum , 4)) + 1 , 4 , 0)) from mytest m
然后再insert即可
insert into mytest values(3,now(), (select concat('SP',date_format(now(),'%Y%m%d') , lpad(max(right(shoppingNum , 4)) + 1 , 4 , 0)) from mytest ));
MySQL根据触发器编写自定义流水号
首先我们创建一张订单表
sn_day,记录按天生成的序列号; sn_hours,记录按小时生成的序列号; sn_minutes 表示按分生成的序列号;
当然,你可以按自己的需要去定义这个字段名.
CREATE TABLE orders ( sn_day DECIMAL (32) PRIMARY KEY, sn_hours DECIMAL (32), sn_minutes DECIMAL (32), remark VARCHAR (100) );
我们在这订单表新增数据时
自动生成序列号.而不是我们主动去插入这个序列号.那么就需要用到触发器.顾名思义,触发嘛.
那就是,在订单表,新增数据里触发了自动生成序列号.
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;
create trigger sn_by_day 创建一个触发器,名称叫 sn_by_day
before insert
在插入前on orders
在订单表上
总结下来就是,当订单表插入数据前,得先触发一个名叫 sn_by_day 的事件.
事件的流程:
- 1.先定义一个变量,叫n
- 2.在订单表中查询 sn_day 字段值的1-8位等于当前日期的数据
- 3.在这个数据中,取后10位最大的,如果没有,则为0
- 4.将这个查询出来的值赋给变量n
- 5.将变量n加上10000000001,当然,要加上多少,你可以自己定.主要是为了蹭长度
- 6.在当前日期将这个值呢拼接上,然后就生成了一个以当前日期开头的增长序列值
- 7.将这个增长序列值存到 sn_day 字段中.
#强势插入一条数据,看能不能自动生成序列号 INSERT orders (remark) VALUES (CONCAT('demo',DATE_FORMAT(NOW(),'%Y-%m-%d %h:%i:%s')));
额,没忍住,多插了几下,不过,好在有结果了! 有红框中,新的一分钟里,重新生成了序列
好啦,按日生成序列号的需求完事了.我们就按这个套路来,顺手把按时,按分生成序列号的也给做了吧!
CREATE TRIGGER sn_by_hours BEFORE INSERT ON orders FOR EACH ROW BEGIN DECLARE n INT; SELECT IFNULL(max(RIGHT(sn_hours, 8)), 0) INTO n FROM orders WHERE mid(sn_hours, 1, 10) = FROM_UNIXTIME( UNIX_TIMESTAMP(NOW(6)), '%Y%m%d%h' ); SET NEW.sn_hours = concat( FROM_UNIXTIME( UNIX_TIMESTAMP(NOW(6)), '%Y%m%d%h' ), RIGHT (100000001 + n, 8) ); END;
按分
CREATE TRIGGER sn_by_minutes BEFORE INSERT ON orders FOR EACH ROW BEGIN DECLARE n INT; SELECT IFNULL(max(RIGHT(sn_minutes, 6)), 0) INTO n FROM orders WHERE mid(sn_minutes, 1, 12) = FROM_UNIXTIME( UNIX_TIMESTAMP(NOW(6)), '%Y%m%d%h%i' ); SET NEW.sn_minutes = concat( FROM_UNIXTIME( UNIX_TIMESTAMP(NOW(6)), '%Y%m%d%h%i' ), RIGHT (1000001 + n, 6) ); END;
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。