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 ;