mySQL生成用户编码

系统中经常有一些编码需要生成,以下是生成编码的设计。

下面OPC,DB,EB生成编码的时候要求不带4。

通过调用函数的方式如:SELECT f_getmaxid(1)就可以得到对应的编码。

表设计:

CREATE TABLE `t_sys_maxid` (
  `tagid` int(8) NOT NULL COMMENT '识别号',
  `maxno` int(11) NOT NULL COMMENT '最大号',
  `idlen` tinyint(4) NOT NULL COMMENT '最大号',
  `idpre` varchar(4) NOT NULL COMMENT '前缀',
  `isid` char(1) NOT NULL COMMENT '是否是字符ID',
  PRIMARY KEY (`tagid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

调用函数:

DELIMITER $$

USE `weipansettlementdb0420`$$

DROP FUNCTION IF EXISTS `f_getmaxid`$$

CREATE DEFINER=`weipan_jy`@`%` FUNCTION `f_getmaxid`(p_tagid TINYINT) RETURNS VARCHAR(10) CHARSET utf8
    MODIFIES SQL DATA
BEGIN
  DECLARE v_idlen TINYINT; 	#总长度
  DECLARE v_isid CHAR(1); 	#是否是ID
  DECLARE v_i INT DEFAULT 1; 	#循环变量
  DECLARE v_j INT DEFAULT 1; 	#循环变量
  DECLARE v_num INT DEFAULT 1;	#排除4的变量
  DECLARE v_numlen INT;		#排除4变量的长度
  DECLARE v_index INT;		#4出现的位置
  DECLARE v_zerocnt INT; 	#加零数量
  DECLARE v_id VARCHAR(10); 	#返回的ID;
  DECLARE v_idpre VARCHAR(4);	#前缀
  
  UPDATE t_sys_maxid SET maxno=1+@mno:=maxno,isid=@isid:=isid 
  WHERE tagid=p_tagid;
  
  SELECT idpre INTO v_idpre
  FROM t_sys_maxid WHERE tagid=p_tagid;
  
  IF (v_idpre='OPC' OR v_idpre='DB' OR v_idpre='EB') THEN
    SET v_numlen=LENGTH(CONVERT(@mno+1,CHAR(10))); 
    SET v_index=LOCATE('4', CONVERT(@mno+1,CHAR(10))); 
  
    IF v_index > 0 THEN
      SET v_index=v_numlen-v_index;
      IF v_index > 0 THEN
        WHILE v_j<=v_index DO
	  SET v_num=v_num*10;
	  SET v_j=v_j+1;
        END WHILE;
      END IF;
      UPDATE t_sys_maxid SET maxno=maxno+v_num
      WHERE tagid=p_tagid;
    END IF;
  END IF;
  
  IF @isid='Y' THEN
  
    SELECT idpre,idlen,isid INTO v_id,v_idlen,v_isid
    FROM t_sys_maxid
    WHERE tagid=p_tagid;
  
    SET v_zerocnt=v_idlen-LENGTH(CONCAT(CONVERT(@mno,CHAR(10)),v_id));
  
    WHILE v_i<=v_zerocnt DO
      SET v_id=CONCAT(v_id,'0');
      SET v_i=v_i+1;
    END WHILE;
  
    SET v_id=CONCAT(v_id,TRIM(CONVERT(@mno,CHAR(10))));
  ELSE
    SET v_id=TRIM(CONVERT(@mno,CHAR(10)));
  END IF;
  
  RETURN v_id;
END$$

DELIMITER ;
原文地址:https://www.cnblogs.com/CarlBlogs/p/7405424.html