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;
这里有个坑 如果存储过程中表一定要跟别名,记住一定要跟别名