mysql 存储过程生成流水号

发布时间 2023-07-14 16:51:35作者: EarlyTao
/**
@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;

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