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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM