最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL如何生成自增的流水號

 更新時間:2023年07月17日 14:21:01   作者:三文魚先生  
這篇文章主要介紹了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)原理

    這篇文章主要介紹了MYSQL數(shù)據(jù)庫Innodb?引擎mvcc鎖實(shí)現(xiàn)原理,但是mvcc?的實(shí)現(xiàn)原理是什么呢?下文我們就來實(shí)例說明來mvcc?的實(shí)現(xiàn)原理,感興趣的小伙伴可以參考一下
    2022-05-05
  • MySQL基于SSL安全連接的主從復(fù)制(過程詳解)

    MySQL基于SSL安全連接的主從復(fù)制(過程詳解)

    SSL(Secure Sockets Layer 安全套接層),及其繼任者傳輸層安全(Transport Layer Security,TLS)是為網(wǎng)絡(luò)通信提供安全及數(shù)據(jù)完整性的一種安全協(xié)議,這篇文章主要介紹了MySQL基于SSL安全連接的主從復(fù)制,需要的朋友可以參考下
    2023-04-04
  • MySQL表分區(qū)配置入門指南

    MySQL表分區(qū)配置入門指南

    這篇文章主要為大家介紹了MySQL表分區(qū)配置入門指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • MySQL中pt-table-checksum實(shí)現(xiàn)主從一致性校驗(yàn)的終極方案

    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檢索數(shù)據(jù)操作方法梳理

    MySQL檢索數(shù)據(jù)操作方法梳理

    SELECT語句是SQL中最常用的語句。它的用途是從一個或多個表中檢索信息。為了使用SELECT檢索表數(shù)據(jù),必須至少給出兩條信息:想選擇什么、從什么地方選擇
    2022-10-10
  • 一篇文章徹底弄懂MySQL的多種連接方式

    一篇文章徹底弄懂MySQL的多種連接方式

    這篇文章主要介紹了MySQL多種連接方式的相關(guān)資料,包括內(nèi)連接、左連接、右連接、全連接、交叉連接、自然連接和不等值連接等,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-04-04
  • MySQL中IF語句的基礎(chǔ)及進(jìn)階用法

    MySQL中IF語句的基礎(chǔ)及進(jìn)階用法

    在Mysql數(shù)據(jù)庫中實(shí)現(xiàn)判斷功能有很多方式,具體又分為函數(shù)和if語句形式,下面這篇文章主要給大家介紹了關(guān)于MySQL中IF語句的基礎(chǔ)及進(jìn)階用法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • MySQL修改默認(rèn)存儲引擎的實(shí)現(xiàn)方法

    MySQL修改默認(rèn)存儲引擎的實(shí)現(xiàn)方法

    下面小編就為大家?guī)硪黄狹ySQL修改默認(rèn)存儲引擎的實(shí)現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • mysql定時備份shell腳本和還原的示例

    mysql定時備份shell腳本和還原的示例

    數(shù)據(jù)庫備份是防止數(shù)據(jù)丟失的一種重要手段,生產(chǎn)環(huán)境中,數(shù)據(jù)的安全性是至關(guān)重要的,任何數(shù)據(jù)的丟失都可能產(chǎn)生嚴(yán)重的后果,所以本文給大家介紹了mysql定時備份shell腳本和還原的實(shí)例,需要的朋友可以參考下
    2024-02-02
  • mysql常用函數(shù)匯總(分享)

    mysql常用函數(shù)匯總(分享)

    以下是對mysql中的常用函數(shù)進(jìn)行了匯總介紹。需要的朋友可以過來參考下
    2013-08-08

最新評論

塘沽区| 大理市| 元阳县| 金溪县| 韩城市| 哈巴河县| 新干县| 微山县| 星座| 通河县| 图木舒克市| 大化| 项城市| 普格县| 甘洛县| 嘉义县| 丰镇市| 增城市| 永济市| 绥中县| 文成县| 新兴县| 建德市| 山西省| 昌平区| 鹿泉市| 图木舒克市| 广丰县| 宜兰县| 康乐县| 绵竹市| 蒲城县| 丰镇市| 达日县| 土默特左旗| 石楼县| 兴业县| 盈江县| 龙里县| 射阳县| 西安市|