業務需求:需產生一個連續的單號,例如YH2019012400001,YH2019012400002;第二天又重新從1生成連續的單號
mysql版本:5.5+
JDK 1.8+
mybatis 3.4+
一,寫這個函數的好處
1.從java代碼邏輯上操作的話,並發量大的話,很難保證出現連續的,而且代碼邏輯也會變得復雜,不好維護
2.從數據庫方向下手的話,不用我們手動管理,減輕壓力;事務不提交就不會生成,保證了連續性和穩定性
二,代碼分析
-- 創建一個無參的函數
create function createSalesOrderReturnNo()
-- 設置函數的返回值
returns varchar(32)
BEGIN -- 函數頭
-- 聲明參數
DECLARE salesOrderReturnNo VARCHAR(32);
DECLARE dateData VARCHAR(6);
DECLARE runningNum VARCHAR(5);
DECLARE maxNum VARCHAR(5);
-- 獲取當日最大數量
SET maxNum = SELECT COUNT(*)+1 FROM erp_sales_order_return s WHERE DATE_FORMAT(s.createTime,'%Y%m%d') = DATE_FORMAT(NOW(),'%Y%m%d');
-- 獲取當前日期格式,並格式化
SET dateData = DATE_FORMAT(NOW(),'%Y%m%d');
-- 獲取流水號,先拼接,后截取
SET runningNum = select RIGHT((SELECT CONCAT('00000',maxNum)),5);
-- 拼接返回單號,注意前后順序
SET salesOrderReturnNo = CONCAT(dateData,runningNum);
-- 返回單號
return salesOrderReturnNo;
END;
不過執行的時候可能會遇到這樣的一個錯誤(就是執行語言有 @ % 符號時執行權限不夠);截圖放不上。。。
解決可以去搜索執行語句,然后執行,成功之后在重啟數據庫;
結語:任何問題先從業務下手,業務無法解決在從技術解決,如果都不行,就想個折中的方法,各讓一步