mysql 生成流水號 儲存過程 訂單編號

2021-08-14 17:02:06 字數 3768 閱讀 8170

用儲存過程生成流水號是很常用的,這裡以生成訂單編號的流水號作為示例。(新的一天的流水號從1開始,如:今天的訂單編號是cd20130109

00014,下乙個訂單編號將是cd20130109

00015;明天的訂單編號將從cd20130110

00001開始)

生成規則:2位字首+年月日+5位流水號 或者 2位字首+年月日時分+5位流水號 或者 2位字首+年月日時分秒+5位流水號。

測試訂單表(test_orders):

[sql]view plain

copy

create

table

`test_orders` (    

`id` int

(11) 

notnull

auto_increment,    

`orderno` varchar

(25) 

notnull

default

'',    

`ordername` char

(10) 

notnull

default

'',    

primary

key(`id`)    

) engine=innodb auto_increment=76 default

charset=utf8  

生成訂單編號的儲存過程(generate_orderno):

[sql]view plain

copy

create

definer=

procedure

`generate_orderno`(

inordernamepre 

char

(2), 

innum 

int, 

outneworderno 

varchar

(25))    

begin

declare

currentdate 

varchar

(15) ;

-- 當前日期,有可能包含時分秒   

declare

maxno 

intdefault

0 ; 

-- 離現在最近的滿足條件的訂單編號的流水號最後5位,如:sh2013011000002的maxno=2   

--  declare l_orderno varchar (25) ;-- 新生成的訂單編號   

--  declare olddate date ;-- 離現在最近的滿足條件的訂單編號的日期   

declare

oldorderno 

varchar

(25) 

default'';

-- 離現在最近的滿足條件的訂單編號   

if num = 8 then

-- 根據年月日生成訂單編號   

select

date_format(now(), 

'%y%m%d'

) into

currentdate ;

-- 訂單編號形式:字首+年月日+流水號,如:sh2013011000002   

elseif num = 14 then

-- 根據年月日時分秒生成訂單編號   

select

date_format(now(), 

'%y%m%d%h%i%s'

) into

currentdate ; 

-- 訂單編號形式:字首+年月日時分秒+流水號,如:sh2013011010050700001,個人不推薦使用這種方法生成流水號   

else

-- 根據年月日時分生成訂單編號   

select

date_format(now(), 

'%y%m%d%h%i'

) into

currentdate ;

-- 訂單形式:字首+年月日時分+流水號,如:sh20130110100900005   

endif ;    

select

ifnull(orderno, 

'') 

into

oldorderno     

from

test_orders     

where

substring

(orderno, 3, num) = currentdate     

andsubstring

(orderno, 1, 2) = ordernamepre     

andlength(orderno) = 7 + num    

order

byid 

desc

limit 1 ; 

-- 有多條時只顯示離現在最近的一條   

if oldorderno != ''

then

setmaxno = 

convert

(substring

(oldorderno, -5), 

decimal

) ;-- substring(oldorderno, -5):訂單編號如果不為『『擷取訂單的最後5位   

endif ;    

select

concat(ordernamepre, currentdate,  lpad((maxno + 1), 5, '0'

)) into

neworderno ; 

-- lpad((maxno + 1), 5, '0'):如果不足5位,將用0填充左邊   

insert

into

test_orders (orderno, ordername) 

values

(neworderno, 

'testno'

) ; 

-- 向訂單表中插入資料   

--    set neworderno = l_orderno;   

select

neworderno ;    

end

引數說明:ordernamepre:(輸入)訂單編號的字首,這裡設定為兩個字元

num:(輸入)將按什麼規則生成流水號(生成規則有:年月日、年月日時分秒、年月日時分三種),可選的num有:8、12、14

neworderno:(輸出)新生成的訂單編號

生成中的一些說明在儲存過程中已經寫得很明確了,這裡不再重複。

呼叫儲存過程向表中插入資料:

[sql]view plain

copy

set@orderno = 

'';    

call `generate_orderno`('sh'

, 12, @orderno);    

select

@orderno;  

檢視生成的資料(我這裡呼叫了很多次,所以生成的資料很多):

在實際專案中只需要修改其中的一些生成規則即可,到此為止,流水號的生成就搞定了,是不是很簡單

有關mysql儲存過程的知識可以參考我的這篇文章:mysql儲存過程詳解

儲存過程生成流水號

格式如a20110915001,第1位寫死a,2 5位為年,6 7位為月,8 9位為日,最後三位為流水號.declare newvalue varchar 12 declare newcode varchar 3 declare oldcode varchar 3 declare oldyearmo...

MySQL獲取流水號儲存過程

通過事務機制,可保證流水號的更新和讀取的完整性。delimiter 獲取流水號 drop procedure if exists get sid create procedure get sid para domain varchar 20 out para sid bigint unsigned ...

流水號工單號生成 儲存過程

1.生成格式 工單型別 日期 四位流水號 例如 1101 20100517 1104 儲存過程 create procedure dbo cs spcreateformkey asdeclare currentmaxid char 4 id char 4 begin set nocount on s...