用存儲過程生成流水號是很常用的,這里以生成訂單編號的流水號作為示例。(新的一天的流水號從1開始,如:今天的訂單編號是CD2013010900014,下一個訂單編號將是CD2013010900015;明天的訂單編號將從CD2013011000001開始)
生成規則:
2位前綴+年月日+5位流水號
或者 2位前綴+年月日時分+5位流水號
或者 2位前綴+年月日時分秒+5位流水號。
測試訂單表(test_orders):
1 CREATE TABLE `test_orders` ( 2 `id` int(11) NOT NULL AUTO_INCREMENT, 3 `orderNo` varchar(25) NOT NULL DEFAULT '', 4 `orderName` char(10) NOT NULL DEFAULT '', 5 PRIMARY KEY (`id`) 6 ) ENGINE=InnoDB AUTO_INCREMENT=76 DEFAULT CHARSET=utf8
生成訂單編號的存儲過程(generate_orderNo):
1 CREATE DEFINER=PROCEDURE `generate_orderNo`(in orderNamePre char(2), in num int, out newOrderNo varchar(25)) 2 BEGIN 3 DECLARE currentDate varCHAR (15) ;-- 當前日期,有可能包含時分秒 4 DECLARE maxNo INT DEFAULT 0 ; -- 離現在最近的滿足條件的訂單編號的流水號最后5位,如:SH2013011000002的maxNo=2 5 -- DECLARE l_orderNo varCHAR (25) ;-- 新生成的訂單編號 6 -- DECLARE oldDate DATE ;-- 離現在最近的滿足條件的訂單編號的日期 7 DECLARE oldOrderNo VARCHAR (25) DEFAULT '' ;-- 離現在最近的滿足條件的訂單編號 8 9 if num = 8 then -- 根據年月日生成訂單編號 10 SELECT DATE_FORMAT(NOW(), '%Y%m%d') INTO currentDate ;-- 訂單編號形式:前綴+年月日+流水號,如:SH2013011000002 11 elseif num = 14 then -- 根據年月日時分秒生成訂單編號 12 SELECT DATE_FORMAT(NOW(), '%Y%m%d%H%i%s') INTO currentDate ; -- 訂單編號形式:前綴+年月日時分秒+流水號,如:SH2013011010050700001,個人不推薦使用這種方法生成流水號 13 else -- 根據年月日時分生成訂單編號 14 SELECT DATE_FORMAT(NOW(), '%Y%m%d%H%i') INTO currentDate ;-- 訂單形式:前綴+年月日時分+流水號,如:SH20130110100900005 15 end if ; 16 17 SELECT IFNULL(orderNo, '') INTO oldOrderNo 18 FROM test_orders 19 WHERE SUBSTRING(orderNo, 3, num) = currentDate 20 AND SUBSTRING(orderNo, 1, 2) = orderNamePre 21 and length(orderNo) = 7 + num 22 ORDER BY id DESC LIMIT 1 ; -- 有多條時只顯示離現在最近的一條 23 24 IF oldOrderNo != '' THEN 25 SET maxNo = CONVERT(SUBSTRING(oldOrderNo, -5), DECIMAL) ;-- SUBSTRING(oldOrderNo, -5):訂單編號如果不為‘‘截取訂單的最后5位 26 END IF ; 27 SELECT 28 CONCAT(orderNamePre, currentDate, LPAD((maxNo + 1), 5, '0')) INTO newOrderNo ; -- LPAD((maxNo + 1), 5, '0'):如果不足5位,將用0填充左邊 29 30 INSERT INTO test_orders (orderNo, orderName) VALUES (newOrderNo, 'testNo') ; -- 向訂單表中插入數據 31 -- set newOrderNo = l_orderNo; 32 SELECT 33 newOrderNo ; 34 END
參數說明:
orderNamePre:(輸入)訂單編號的前綴,這里設定為兩個字符
num:(輸入)將按什么規則生成流水號(生成規則有:年月日、年月日時分秒、年月日時分三種),可選的num有:8、12、14
newOrderNo:(輸出)新生成的訂單編號
調用存儲過程向表中插入數據:
SET @orderNo = '';
CALL `generate_orderNo`('SH', 12, @orderNo);
SELECT @orderNo;
查看生成的數據:
在實際項目中只需要修改其中的一些生成規則即可,到此為止,流水號的生成就搞定了
有關mysql存儲過程的知識可以參考:MySQL存儲過程詳解