mysql 生成流水號(hào) 存儲(chǔ)過(guò)程 訂單編號(hào)

用存儲(chǔ)過(guò)程生成流水號(hào)是很常用的,這里以生成訂單編號(hào)的流水號(hào)作為示例。(新的一天的流水號(hào)從1開(kāi)始,如:今天的訂單編號(hào)是CD2013 0109 00014 ,下一個(gè)訂單編號(hào)將是 CD 2013 0109 00015 ; 明天的訂單編號(hào)將從 CD 2013 0110 00001 開(kāi)始) 生成規(guī)則:2位前綴

用存儲(chǔ)過(guò)程生成流水號(hào)是很常用的,這里以生成訂單編號(hào)的流水號(hào)作為示例。(新的一天的流水號(hào)從1開(kāi)始,如:今天的訂單編號(hào)是cd2013010900014,下一個(gè)訂單編號(hào)將是cd2013010900015明天的訂單編號(hào)將從cd2013011000001開(kāi)始)

生成規(guī)則:2位前綴+年月日+5位流水號(hào) 或者 2位前綴+年月日時(shí)分+5位流水號(hào) 或者?2位前綴+年月日時(shí)分秒+5位流水號(hào)。

測(cè)試訂單表(test_orders):

CREATE TABLE `test_orders` (     `id` int(11) NOT NULL AUTO_INCREMENT,     `orderNo` varchar(25) NOT NULL DEFAULT '',     `orderName` char(10) NOT NULL DEFAULT '',     PRIMARY KEY (`id`)   ) ENGINE=InnoDB AUTO_INCREMENT=76 DEFAULT CHARSET=utf8

生成訂單編號(hào)的存儲(chǔ)過(guò)程(generate_orderNo):

CREATE DEFINER=PROCEDURE `generate_orderNo`(in orderNamePre char(2), in num int, out newOrderNo varchar(25))   BEGIN     DECLARE currentDate varCHAR (15) ;-- 當(dāng)前日期,有可能包含時(shí)分秒      DECLARE maxNo INT DEFAULT 0 ; -- 離現(xiàn)在最近的滿足條件的訂單編號(hào)的流水號(hào)最后5位,如:SH2013011000002的maxNo=2    --  DECLARE l_orderNo varCHAR (25) ;-- 新生成的訂單編號(hào)    --  DECLARE oldDate DATE ;-- 離現(xiàn)在最近的滿足條件的訂單編號(hào)的日期      DECLARE oldOrderNo VARCHAR (25) DEFAULT '' ;-- 離現(xiàn)在最近的滿足條件的訂單編號(hào)           if num = 8 then -- 根據(jù)年月日生成訂單編號(hào)        SELECT DATE_FORMAT(NOW(), '%Y%m%d') INTO currentDate ;-- 訂單編號(hào)形式:前綴+年月日+流水號(hào),如:SH2013011000002      elseif num = 14 then -- 根據(jù)年月日時(shí)分秒生成訂單編號(hào)        SELECT DATE_FORMAT(NOW(), '%Y%m%d%H%i%s') INTO currentDate ; -- 訂單編號(hào)形式:前綴+年月日時(shí)分秒+流水號(hào),如:SH2013011010050700001,個(gè)人不推薦使用這種方法生成流水號(hào)      else -- 根據(jù)年月日時(shí)分生成訂單編號(hào)        SELECT DATE_FORMAT(NOW(), '%Y%m%d%H%i') INTO currentDate ;-- 訂單形式:前綴+年月日時(shí)分+流水號(hào),如:SH20130110100900005      end if ;          SELECT IFNULL(orderNo, '') INTO oldOrderNo      FROM test_orders      WHERE SUBSTRING(orderNo, 3, num) = currentDate        AND SUBSTRING(orderNo, 1, 2) = orderNamePre        and length(orderNo) = 7 + num     ORDER BY id DESC LIMIT 1 ; -- 有多條時(shí)只顯示離現(xiàn)在最近的一條           IF oldOrderNo != '' THEN        SET maxNo = CONVERT(SUBSTRING(oldOrderNo, -5), DECIMAL) ;-- SUBSTRING(oldOrderNo, -5):訂單編號(hào)如果不為‘‘截取訂單的最后5位      END IF ;     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') ; -- 向訂單表中插入數(shù)據(jù)    --    set newOrderNo = l_orderNo;      SELECT        newOrderNo ;   END

參數(shù)說(shuō)明:orderNamePre:(輸入)訂單編號(hào)的前綴,這里設(shè)定為兩個(gè)字符
? ? ? ? ? ? ? ? ? num:(輸入)將按什么規(guī)則生成流水號(hào)(生成規(guī)則有:年月日、年月日時(shí)分秒、年月日時(shí)分三種),可選的num有:8、12、14
? ? ? ? ? ? ? ? ? newOrderNo:(輸出)新生成的訂單編號(hào)

生成中的一些說(shuō)明在存儲(chǔ)過(guò)程中已經(jīng)寫(xiě)得很明確了,這里不再重復(fù)。

調(diào)用存儲(chǔ)過(guò)程向表中插入數(shù)據(jù):

SET @orderNo = '';   CALL `generate_orderNo`('SH', 12, @orderNo);   SELECT @orderNo;

查看生成的數(shù)據(jù)(我這里調(diào)用了很多次,所以生成的數(shù)據(jù)很多):

mysql 生成流水號(hào) 存儲(chǔ)過(guò)程 訂單編號(hào)???????? mysql 生成流水號(hào) 存儲(chǔ)過(guò)程 訂單編號(hào)

在實(shí)際項(xiàng)目中只需要修改其中的一些生成規(guī)則即可,到此為止,流水號(hào)的生成就搞定了,是不是很簡(jiǎn)單 mysql 生成流水號(hào) 存儲(chǔ)過(guò)程 訂單編號(hào)

有關(guān)mysql存儲(chǔ)過(guò)程的知識(shí)可以參考我的這篇文章:mysql存儲(chǔ)過(guò)程詳解

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊10 分享