數據庫 表中主鍵字符串通過函數取值

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


在sql窗口我們可以通過傳任意表id來取值

開始是空表

例如:select fun_create_id('userId')


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章