如果项目中有特殊要求,表的主键id用varchar类型,那么自增方式只能通过函数来解决。思路就是在函数中定义开始值和最大值,如果通过参数在某表中查无数据就赋值1,有数据就加一,另给该id做了类似加密
首先需要定义表来存放参数 ,记录当前数据 tbl_base_seq
其次定义函数fun_create_id
BEGIN
DECLARE cRES_ID varchar(32);#返回值
DECLARE RES_ID INT(32) UNSIGNED;#递增值
DECLARE prefix varchar(30);
DECLARE vextract varchar(30);
DECLARE temp_start INT(32) UNSIGNED;#初始值
DECLARE temp_end INT(32) UNSIGNED;#最大值
DECLARE len INT(3) UNSIGNED;#最大值长度
#查询当前属性,IN_SEQ_NAME是参数
SELECT MAX(s.seq_current),MAX(s.seq_prefix),MAX(seq_extract),MAX(seq_start),MAX(seq_end) INTO RES_ID,prefix,vextract,temp_start,temp_end
FROM TBL_BASE_SEQ s
WHERE s.seq_name = IN_SEQ_NAME;
# 查询参数不在表则把该参数插入表
IF RES_ID IS NULL or RES_ID = '' THEN
INSERT INTO tbl_base_seq(seq_name,seq_current,seq_start) VALUES(IN_SEQ_NAME,1,1);
SET RES_ID = 1;
END IF;
IF temp_end IS NULL or temp_end = '' THEN
set temp_end = 99999999;
END IF;
IF prefix IS NULL OR prefix ='' THEN
set prefix = 'yymmddhh24miss';
END IF;
set len = LENGTH(temp_end);
#有最大值
IF RES_ID<temp_end THEN
UPDATE tbl_base_seq SET seq_current = seq_current+1 WHERE seq_name = IN_SEQ_NAME;
ELSE
UPDATE tbl_base_seq SET seq_current = 1 WHERE seq_name = IN_SEQ_NAME;
END IF;
# 增加前缀
IF prefix IS NOT NULL and prefix != '' THEN
# SELECT CONCAT(TO_CHAR(SYSDATE, prefix),RES_ID) INTO RES_ID FROM DUAL;
select concat(DATE_FORMAT(now(),'%y%m%d%H%i%s'),LPAD(CONCAT(RES_ID,''),len,'0')) INTO cRES_ID FROM DUAL;#日期 0填充 RES_ID 到len长度
ELSE
select RES_ID INTO cRES_ID FROM DUAL;
END IF;
#增加后缀
IF vextract IS NOT NULL and vextract != '' THEN
#SELECT CONCAT(RES_ID,TO_CHAR(SYSDATE, vextract)) INTO cRES_ID FROM DUAL;
select concat(LPAD(CONCAT(RES_ID,''),len,'0'),DATE_FORMAT(now(),'%y%m%d%H%i%s')) into cRES_ID from dual;
END IF;
RETURN cRES_ID;
END
CONCAT(str1,str2....)是字符串拼接
DATE_FORMAT(now(),'%y%m%d%H%i%s')是已某格式显示日期
LPAD(str,len,str2)是在str左边填充str2直到长度为len
开始是空表
例如:select fun_create_id('userId')