如果項目中有特殊要求,表的主鍵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')