這篇文章發佈後,有朋友問有沒有SQL server版本的,現在有了《SQL server高並發生成唯一訂單號》
#推薦:《mysql教學》
在一個erp進銷存系統或0A等其他系統中,如果多人同時進行生成訂單號的操作的話,容易出現多人獲得同一個訂單號的情況,對公司業務造成不可挽回的損失
我們可以利用預存程序和資料表搭配,建立一張表和建立預存程序,預存程序負責產生訂單號,表負責處理唯一性問題
當預存程序產生訂單編號,先把訂單號寫進表中,再把訂單號結果顯示出來,把生成的訂單號碼寫進表裡會出現兩種情況,為什麼呢?因為我們的表設定了主鍵(主鍵唯一性)
下面將用程式碼和實際操作講解下產生唯一訂單號的過程
產生訂單編號格式為:自訂前綴年月日後綴(001、002、003)
1.先建立一個預存程序
輸入為BILL_TYPE(字首),輸出為BILL_NOP(訂單編號)
CREATE DEFINER = CURRENT_USER PROCEDURE `getbillno`(in BILL_TYPE VARCHAR(3), out BILL_NOP varchar(25))BEGIN
2.產生年月日和後綴
年月日為目前系統時間,後綴初始值為0
DECLARE currentDate varCHAR (15);DECLARE lastno INT DEFAULT 0;SELECT DATE_FORMAT(NOW(), '%Y%m%d') INTO currentDate;
3.查詢表格,取得表格的訂單編號
查詢表格,取得前綴與自訂內容相關的最新一個訂單編號
SELECT IFNULL(BILL_NO, 'notnull') INTO BILL_NOP FROM temp_bill WHERE SUBSTRING(BILL_NO,1,3) =BILL_TYPE and SUBSTRING(BILL_NO,4,8) =currentDate ORDER BY BILL_NO DESC LIMIT 1;
4.產生訂單編號
如果上一步驟取得的訂單編號不為空,新產生的訂單號碼在原訂單號碼上1
範例:取得的訂單編號:UIE20200611015
即產生的訂單編號為: UIE20200611016
如果上一步取得的訂單號碼為空,新產生的訂單號碼後綴為001
例如:產生的訂單號碼:UIE20200611001
IF BILL_NOP !='' THEN SET lastno = CONVERT(SUBSTRING(BILL_NOP, -3), DECIMAL) ; SELECT CONCAT(BILL_TYPE,currentDate,LPAD((lastno + 1),3, '0')) INTO BILL_NOP ;ELSE SELECT CONCAT(BILL_TYPE,currentDate,LPAD((lastno + 1),3, '0')) INTO BILL_NOP ;END IF;
不存在相同訂單號碼則插入表成功
INSERT INTO temp_bill (BILL_NO, BILL_TYPE) VALUES (BILL_NOP,BILL_TYPE) ;
SELECT BILL_NOP;
UIE20200611001
2當我第二次輸入時,由於表裡有數據了,會根據最新的訂單編號後綴加1
UIE20200611002
五、不是小結的小結
#一個卑微菜雞的自述:
積分充足的就直接下載吧,沒有積分的對著圖敲,反正程式碼量也不大
如果你是學生,沒有積分,可以私聊我,免費給你發源碼
代碼下載連結:mysql_getbillno.sql代碼截圖:
########################################################### #以上是MySQL高並發生成唯一訂單號的詳細內容。更多資訊請關注PHP中文網其他相關文章!