MySQL如何生成自增的流水号

 更新时间:2023年07月17日 14:21:01   作者:三文鱼先生  
这篇文章主要介绍了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;

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MYSQL数据库Innodb 引擎mvcc锁实现原理

    MYSQL数据库Innodb 引擎mvcc锁实现原理

    这篇文章主要介绍了MYSQL数据库Innodb 引擎mvcc锁实现原理,但是mvcc 的实现原理是什么呢?下文我们就来实例说明来mvcc 的实现原理,感兴趣的小伙伴可以参考一下
    2022-05-05
  • MySQL基于SSL安全连接的主从复制(过程详解)

    MySQL基于SSL安全连接的主从复制(过程详解)

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议,这篇文章主要介绍了MySQL基于SSL安全连接的主从复制,需要的朋友可以参考下
    2023-04-04
  • MySQL表分区配置入门指南

    MySQL表分区配置入门指南

    这篇文章主要为大家介绍了MySQL表分区配置入门指南,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • MySQL中pt-table-checksum实现主从一致性校验的终极方案

    MySQL中pt-table-checksum实现主从一致性校验的终极方案

    pt-table-checksum 凭借低侵入性、高准确性和良好的兼容性,成为 MySQL 主从一致性校验的首选工具,下面就来详细的介绍一下MySQL中pt-table-checksum实现主从一致性校验,感兴趣的可以了解一下
    2026-04-04
  • MySQL检索数据操作方法梳理

    MySQL检索数据操作方法梳理

    SELECT语句是SQL中最常用的语句。它的用途是从一个或多个表中检索信息。为了使用SELECT检索表数据,必须至少给出两条信息:想选择什么、从什么地方选择
    2022-10-10
  • 一篇文章彻底弄懂MySQL的多种连接方式

    一篇文章彻底弄懂MySQL的多种连接方式

    这篇文章主要介绍了MySQL多种连接方式的相关资料,包括内连接、左连接、右连接、全连接、交叉连接、自然连接和不等值连接等,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2026-04-04
  • MySQL中IF语句的基础及进阶用法

    MySQL中IF语句的基础及进阶用法

    在Mysql数据库中实现判断功能有很多方式,具体又分为函数和if语句形式,下面这篇文章主要给大家介绍了关于MySQL中IF语句的基础及进阶用法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • MySQL修改默认存储引擎的实现方法

    MySQL修改默认存储引擎的实现方法

    下面小编就为大家带来一篇MySQL修改默认存储引擎的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • mysql定时备份shell脚本和还原的示例

    mysql定时备份shell脚本和还原的示例

    数据库备份是防止数据丢失的一种重要手段,生产环境中,数据的安全性是至关重要的,任何数据的丢失都可能产生严重的后果,所以本文给大家介绍了mysql定时备份shell脚本和还原的实例,需要的朋友可以参考下
    2024-02-02
  • mysql常用函数汇总(分享)

    mysql常用函数汇总(分享)

    以下是对mysql中的常用函数进行了汇总介绍。需要的朋友可以过来参考下
    2013-08-08

最新评论