mysql 存储过程生成流水号

复制代码
/**
@v_serial_number 最新流水号输出
@prefix 前缀
@suffix 后缀
*/
CREATE PROCEDURE `generate_serial_number`(OUT v_serial_number VARCHAR(32), prefix VARCHAR(20), suffix VARCHAR(20))
BEGIN
DECLARE v_prefix VARCHAR(32);
DECLARE v_suffix VARCHAR(32);
DECLARE v_serial_no INT DEFAULT 0;

-- 根据前缀查询是否存在
SELECT COUNT(*)  INTO @v_cnt FROM sys_serial_number sn WHERE sn.`prefix` = prefix FOR UPDATE;
-- 如果存在
IF @v_cnt > 0 THEN
        -- 获取当前序列号
        SELECT `prefix`, `suffix`, `serial_number` INTO v_prefix, v_suffix, v_serial_no
        FROM sys_serial_number ssn
        WHERE ssn.`prefix` = prefix
        FOR UPDATE;
        -- 更新序列号
        UPDATE sys_serial_number ssnn SET ssnn.`serial_number` = `serial_number` + 1, ssnn.`update_time` = NOW() WHERE ssnn.`prefix` = prefix;
        -- 生成结果
        SET v_serial_number = CONCAT(v_prefix, LPAD(v_serial_no + 1, 6, 0), v_suffix);
ELSE 
        SET v_prefix = prefix;
        SET v_suffix = suffix;
        INSERT INTO `sys_serial_number` (`prefix`, `suffix`, `serial_number`,`create_time`) VALUES (v_prefix, v_suffix, 1, NOW());
        SET v_serial_number = CONCAT(v_prefix, LPAD(v_serial_no + 1, 6, 0), v_suffix);
END IF;        
END;
复制代码

执行存储过程:

CALL generate_serial_number(@v_serial_number, 'NO', '');
SELECT @v_serial_number;

这里有个坑 如果存储过程中表一定要跟别名,记住一定要跟别名

posted @   EarlyTao  阅读(224)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示