一、前言
- 按一定规则生成付款订单单号,要求不重复
- 例如:前缀 + 日期 + 不重复流水号,FK202308150001
前缀 日期 不重复流水号
FK 20230815 0001
- 为了避免重复,符合自增有序,接下来使用MySQL锁机制实现
二、具体实现如下
1.创建一张表
CREATE TABLE serial_numbers
(
id INT AUTO_INCREMENT PRIMATY KEY,
serial_number INT,
date DATE
)
2.利用MySQL事件,在每天开始插入一条数据
创建MySQL事件
CREATE EVENT auto_insert_data
ON SCHEDULD EVERY 1 DAY STARTS '开始时间,例如:2023-08-15 00:00:00'
DO
BEGIN
INSERT INTO serial_numbers (serial_number, date)
VALUES (0, CURDATE())
ON DUPLICATE KEY UPDATE serial_numbers = 0
END;
查看已创建事件
SHOW EVENTS;
删除事件
DROP EVENT IF EXISTS auto_insert_data;
3.获取自增流水号
每次调用流水号+1
UPDATE serial_numbers
SET serial_number = LAST_INSERT_ID(serial_number + 1)
WHERE date = CURDATE();
获取流水号
SELECT CONCAT('YX', DATE_FORMAT(date, '%Y%m%d'), LPAD(LAST_INSERT_ID(serial_number), 4, 0)) order_num
FROM serial_numbers
WHERE date = CURDATE();
三、MySQL生成流水号优点
- 并发场景下流水号不重复
- 生成流水号有序