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,記錄按小時(shí)生成的序列號; sn_minutes 表示按分生成的序列號;
當(dāng)然,你可以按自己的需要去定義這個(gè)字段名.
CREATE TABLE orders ( sn_day DECIMAL (32) PRIMARY KEY, sn_hours DECIMAL (32), sn_minutes DECIMAL (32), remark VARCHAR (100) );
我們在這訂單表新增數(shù)據(jù)時(shí)
自動(dòng)生成序列號.而不是我們主動(dòng)去插入這個(gè)序列號.那么就需要用到觸發(fā)器.顧名思義,觸發(fā)嘛.
那就是,在訂單表,新增數(shù)據(jù)里觸發(fā)了自動(dòng)生成序列號.
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)建一個(gè)觸發(fā)器,名稱叫 sn_by_day
before insert
在插入前on orders
在訂單表上
總結(jié)下來就是,當(dāng)訂單表插入數(shù)據(jù)前,得先觸發(fā)一個(gè)名叫 sn_by_day 的事件.
事件的流程:
- 1.先定義一個(gè)變量,叫n
- 2.在訂單表中查詢 sn_day 字段值的1-8位等于當(dāng)前日期的數(shù)據(jù)
- 3.在這個(gè)數(shù)據(jù)中,取后10位最大的,如果沒有,則為0
- 4.將這個(gè)查詢出來的值賦給變量n
- 5.將變量n加上10000000001,當(dāng)然,要加上多少,你可以自己定.主要是為了蹭長度
- 6.在當(dāng)前日期將這個(gè)值呢拼接上,然后就生成了一個(gè)以當(dāng)前日期開頭的增長序列值
- 7.將這個(gè)增長序列值存到 sn_day 字段中.
#強(qiáng)勢插入一條數(shù)據(jù),看能不能自動(dòng)生成序列號 INSERT orders (remark) VALUES (CONCAT('demo',DATE_FORMAT(NOW(),'%Y-%m-%d %h:%i:%s')));
額,沒忍住,多插了幾下,不過,好在有結(jié)果了! 有紅框中,新的一分鐘里,重新生成了序列
好啦,按日生成序列號的需求完事了.我們就按這個(gè)套路來,順手把按時(shí),按分生成序列號的也給做了吧!
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é)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL主從復(fù)制遇到1590報(bào)錯(cuò)解決分析
這篇文章通過一個(gè)主從復(fù)制過程中?1590?的錯(cuò)誤,說明了?MySQL?8.0?在創(chuàng)建用戶授權(quán)過程中的注意事項(xiàng),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08關(guān)于mysql?left?join?查詢慢時(shí)間長的踩坑總結(jié)
這篇文章主要介紹了關(guān)于mysql?left?join?查詢慢時(shí)間長的踩坑總結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09MySQL二進(jìn)制日志(bin_log)的作用與使用方法
BinLog又稱為二進(jìn)制日志,是MySQL服務(wù)層的數(shù)據(jù)日志,MySQL所有的存儲(chǔ)引擎都支持BinLog,這篇文章主要給大家介紹了關(guān)于MySQL二進(jìn)制日志(bin_log)的作用與使用方法的相關(guān)資料,需要的朋友可以參考下2024-06-06Mysql轉(zhuǎn)PostgreSQL注意事項(xiàng)及說明
這篇文章主要介紹了Mysql轉(zhuǎn)PostgreSQL注意事項(xiàng)及說明,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-10-10Ubuntu16.04 server下配置MySQL,并開啟遠(yuǎn)程連接的方法
這篇文章主要介紹了Ubuntu16.04 server下配置MySQL,并開啟遠(yuǎn)程連接的方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2017-01-01生產(chǎn)環(huán)境MySQL索引時(shí)效的排查過程
這篇文章主要介紹了生產(chǎn)環(huán)境MySQL索引時(shí)效的排查過程,文章根據(jù)SQL查詢耗時(shí)特別長,看了執(zhí)行計(jì)劃發(fā)現(xiàn)沒有走索引的問題展開詳細(xì)介紹,需要的朋友可以參考一下2022-04-04