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

用存儲過程生成流水號是很經常使用的,這裏以生成訂單編號的流水號做爲示例。(新的一天的流水號從1開始,如:今天的訂單編號是CD2013010900014,下一個訂單編號將是CD2013010900015;明天的訂單編號將從CD2013011000001開始) mysql

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

測試訂單表(test_orders): 測試

[sql]  view plain copy
  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): spa

[sql]  view plain copy
  1. CREATE DEFINER=PROCEDURE `generate_orderNo`(in orderNamePre char(2), in num intout 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有:八、十二、14
                  newOrderNo:(輸出)新生成的訂單編號
.net

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

調用存儲過程向表中插入數據:
blog

[sql]  view plain copy
  1. SET @orderNo = '';    
  2. CALL `generate_orderNo`('SH', 12, @orderNo);    
  3. SELECT @orderNo ;  

查看生成的數據(我這裏調用了不少次,因此生成的數據不少): get

         

在實際項目中只須要修改其中的一些生成規則便可,到此爲止,流水號的生成就搞定了,是否是很簡單 微笑 it

有關mysql存儲過程的知識能夠參考個人這篇文章:MySQL存儲過程詳解 class

相關文章
相關標籤/搜索