欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL如何生成自增的流水號

 更新時(shí)間:2023年07月17日 14:21:01   作者:三文魚先生  
這篇文章主要介紹了MySQL如何生成自增的流水號問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

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ò)解決分析

    MySQL主從復(fù)制遇到1590報(bào)錯(cuò)解決分析

    這篇文章通過一個(gè)主從復(fù)制過程中?1590?的錯(cuò)誤,說明了?MySQL?8.0?在創(chuàng)建用戶授權(quán)過程中的注意事項(xiàng),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Mysql 5.6.24安裝實(shí)例教程

    Mysql 5.6.24安裝實(shí)例教程

    這篇文章主要介紹了Mysql 5.6.24安裝實(shí)例教程,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-12-12
  • 關(guān)于mysql?left?join?查詢慢時(shí)間長的踩坑總結(jié)

    關(guān)于mysql?left?join?查詢慢時(shí)間長的踩坑總結(jié)

    這篇文章主要介紹了關(guān)于mysql?left?join?查詢慢時(shí)間長的踩坑總結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • MySQL二進(jìn)制日志(bin_log)的作用與使用方法

    MySQL二進(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-06
  • Mysql轉(zhuǎn)PostgreSQL注意事項(xiàng)及說明

    Mysql轉(zhuǎn)PostgreSQL注意事項(xiàng)及說明

    這篇文章主要介紹了Mysql轉(zhuǎn)PostgreSQL注意事項(xiàng)及說明,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-10-10
  • Ubuntu16.04 server下配置MySQL,并開啟遠(yuǎn)程連接的方法

    Ubuntu16.04 server下配置MySQL,并開啟遠(yuǎn)程連接的方法

    這篇文章主要介紹了Ubuntu16.04 server下配置MySQL,并開啟遠(yuǎn)程連接的方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。
    2017-01-01
  • mysql5.5.28安裝教程 超詳細(xì)!

    mysql5.5.28安裝教程 超詳細(xì)!

    這篇文章主要為大家詳細(xì)介紹了mysql5.5.28安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • mysql查詢鎖表方式

    mysql查詢鎖表方式

    在MySQL中,查詢鎖表可以通過多個(gè)命令實(shí)現(xiàn),如show?engine?innodb?status、show?processlist等,用以檢測和解決表鎖問題,首先通過show?engine?innodb?status查看鎖表情況,接著利用show?processlist找出長時(shí)間占用的SQL語句
    2024-09-09
  • MySQL使用profile查詢性能的操作教程

    MySQL使用profile查詢性能的操作教程

    這篇文章主要介紹了MySQL使用profile查詢性能的操作教程,不僅是SQL語句的性能,更能夠收集系統(tǒng)運(yùn)行的CPU及內(nèi)存占用情況,需要的朋友可以參考下
    2015-11-11
  • 生產(chǎn)環(huán)境MySQL索引時(shí)效的排查過程

    生產(chǎn)環(huán)境MySQL索引時(shí)效的排查過程

    這篇文章主要介紹了生產(chǎn)環(huán)境MySQL索引時(shí)效的排查過程,文章根據(jù)SQL查詢耗時(shí)特別長,看了執(zhí)行計(jì)劃發(fā)現(xiàn)沒有走索引的問題展開詳細(xì)介紹,需要的朋友可以參考一下
    2022-04-04

最新評論