MySQL如何生成自增的流水號
MySQL生成自增的流水號
MysSQL生成指定編號
假如我們要生成 類似于 ABCD日期序號 比如
我的購物訂單號:SP20211201001,并且以后四位自增,類似于這樣的場景,該怎么實(shí)現(xiàn)呢?
首先我們分析序號,SP為固定字符,20211201為日期,后面為序號。那么我們要做的第一件事是拼接這三段字符。MySQL中的拼接函數(shù)還記得嗎?
concat函數(shù)
concat的用法
比如
select concat('A', 'B', 'C');
日期相關(guān)函數(shù)
now()獲取當(dāng)前日期
獲取當(dāng)前日期,用法:
select now();

date_format(日期,指定格式) 格式化日期
格式化日期,用于指定查到的日期格式,比如我們流水號中的年月日,比如:
select date_format(now() , '%Y%m%d');
結(jié)果是:

lpad(需填充字符,填充后長度,填充字符串)
select lpad('A' , 4 , 0);結(jié)果

那么現(xiàn)在結(jié)果很明顯了,我們只需要拼接組合一下即可。
select concat('SP',date_format(now(),'%Y%m%d') , lpad('1' , 4 , 0));
如果需要實(shí)現(xiàn)后四位序號自增,該怎么實(shí)現(xiàn)?
我們可以先獲取購物編號的后四位,+1。然后再執(zhí)行插入操作。
找出最大序號:
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根據(jù)觸發(fā)器編寫自定義流水號
首先我們創(chuàng)建一張訂單表
sn_day,記錄按天生成的序列號; sn_hours,記錄按小時生成的序列號; sn_minutes 表示按分生成的序列號;
當(dāng)然,你可以按自己的需要去定義這個字段名.
CREATE TABLE orders ( sn_day DECIMAL (32) PRIMARY KEY, sn_hours DECIMAL (32), sn_minutes DECIMAL (32), remark VARCHAR (100) );
我們在這訂單表新增數(shù)據(jù)時
自動生成序列號.而不是我們主動去插入這個序列號.那么就需要用到觸發(fā)器.顧名思義,觸發(fā)嘛.
那就是,在訂單表,新增數(shù)據(jù)里觸發(fā)了自動生成序列號.
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 創(chuàng)建一個觸發(fā)器,名稱叫 sn_by_day
before insert在插入前on orders在訂單表上
總結(jié)下來就是,當(dāng)訂單表插入數(shù)據(jù)前,得先觸發(fā)一個名叫 sn_by_day 的事件.
事件的流程:
- 1.先定義一個變量,叫n
- 2.在訂單表中查詢 sn_day 字段值的1-8位等于當(dāng)前日期的數(shù)據(jù)
- 3.在這個數(shù)據(jù)中,取后10位最大的,如果沒有,則為0
- 4.將這個查詢出來的值賦給變量n
- 5.將變量n加上10000000001,當(dāng)然,要加上多少,你可以自己定.主要是為了蹭長度
- 6.在當(dāng)前日期將這個值呢拼接上,然后就生成了一個以當(dāng)前日期開頭的增長序列值
- 7.將這個增長序列值存到 sn_day 字段中.
#強(qiáng)勢插入一條數(shù)據(jù),看能不能自動生成序列號
INSERT orders (remark) VALUES (CONCAT('demo',DATE_FORMAT(NOW(),'%Y-%m-%d %h:%i:%s')));額,沒忍住,多插了幾下,不過,好在有結(jié)果了! 有紅框中,新的一分鐘里,重新生成了序列

好啦,按日生成序列號的需求完事了.我們就按這個套路來,順手把按時,按分生成序列號的也給做了吧!
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;
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
MYSQL數(shù)據(jù)庫Innodb?引擎mvcc鎖實(shí)現(xiàn)原理
這篇文章主要介紹了MYSQL數(shù)據(jù)庫Innodb?引擎mvcc鎖實(shí)現(xiàn)原理,但是mvcc?的實(shí)現(xiàn)原理是什么呢?下文我們就來實(shí)例說明來mvcc?的實(shí)現(xiàn)原理,感興趣的小伙伴可以參考一下2022-05-05
MySQL中pt-table-checksum實(shí)現(xiàn)主從一致性校驗(yàn)的終極方案
pt-table-checksum 憑借低侵入性、高準(zhǔn)確性和良好的兼容性,成為 MySQL 主從一致性校驗(yàn)的首選工具,下面就來詳細(xì)的介紹一下MySQL中pt-table-checksum實(shí)現(xiàn)主從一致性校驗(yàn),感興趣的可以了解一下2026-04-04
MySQL修改默認(rèn)存儲引擎的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄狹ySQL修改默認(rèn)存儲引擎的實(shí)現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03

