用儲存過程生成流水號是很常用的,這裡以生成訂單編號的流水號作為示例。(新的一天的流水號從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...