业务需求:需产生一个连续的单号,例如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;
不过执行的时候可能会遇到这样的一个错误(就是执行语言有 @ % 符号时执行权限不够);截图放不上。。。
解决可以去搜索执行语句,然后执行,成功之后在重启数据库;
结语:任何问题先从业务下手,业务无法解决在从技术解决,如果都不行,就想个折中的方法,各让一步