MySql根据配置实现数据表唯一编号自动生成

创建配置表:

CREATE TABLE `sys_seq_ctrl` (

  `seq_type` varchar(50) NOT NULL COMMENT '类型',
  `seq_title` varchar(50) NOT NULL COMMENT '描述',
  `seq_by` char(1) NOT NULL COMMENT '编号产生方式:S顺序号,Y按年,M按年月,D按年月日,W按年周',
  `seq_prefix` varchar(5) NOT NULL COMMENT '编码前缀',
  `seq_midfix` varchar(10) NOT NULL COMMENT '编码中缀',
  `seq_year_len` tinyint(4) NOT NULL COMMENT '年显示长度',
  `seq_seq` int(11) NOT NULL COMMENT '序号',
  `seq_len` tinyint(4) NOT NULL COMMENT '序号显示的最短长度',
  `seq_max_len` tinyint(4) NOT NULL COMMENT '编码长度',
  `seq_suffix` varchar(50) NOT NULL COMMENT '编码后缀',
  `seq_mtable` varchar(50) NOT NULL COMMENT '数据表名称',
  `seq_mkey` varchar(50) NOT NULL COMMENT '数据表主键字段名称', -- 可忽略
  `seq_mseq` varchar(50) DEFAULT NULL COMMENT '数据表状态名称', -- 可忽略
  `seq_mstatus` varchar(50) DEFAULT NULL COMMENT '数据表状态描述名称', -- 可忽略
  PRIMARY KEY (`seq_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统编号生成规则';



----------------------------------------------------------------------
存储过程

CREATE  PROCEDURE `p_getNbr`(in type varchar(50),out nbr varchar(50),out iret int)
leave_return: -- 定义跳出存储过程标记
begin

    declare flag  char(1);
    declare prefix  char(5);
    declare suffix  char(5);
    declare midfix  char(10);
    declare yearlen  int;
    declare maxlen  int;
    declare seqlen  int;
    declare seqtable  char(50);
    declare currMidfix  char(10);
    declare seqmonth  char(2);
    declare ww  char(2);
    declare seq  int;

    
    select seq_mtable,seq_by,seq_prefix,seq_len,seq_midfix,seq_year_len,seq_seq,seq_suffix,seq_max_len INTO
    seqtable,flag,prefix,seqlen,midfix,yearlen,seq,suffix,maxlen  from sys_seq_ctrl where seq_type = type;


    if seqtable is null then
        set nbr='';
        set iret = 70;
        LEAVE leave_return;
     end if;
    
    if not EXISTS( SELECT table_name FROM information_schema.TABLES WHERE table_name =seqtable) then
        set iret = 72;
        LEAVE leave_return;
    end if;
    
    if flag = '' then
        set flag = 'S';
    end if;
    if flag = 'S' then
        set currMidFix = '';
    end if;
    if yearlen = 0 then
         set yearlen = 2 ;
    end if;
    if UCASE(flag) = 'Y' then
        set currMidFix = RIGHT( year( CURRENT_DATE ( ) ),yearlen);
    end if;
    if UCASE(flag) = 'M' then
        set currMidFix = CONCAT(RIGHT(year( CURRENT_DATE( )),yearlen),
                        right( LPAD(month( CURRENT_DATE( )),2,'0'),2));
    end if;  
    if UCASE(flag)= 'D' then
        set currMidFix =  CONCAT(RIGHT(year( CURRENT_DATE( )),yearlen),
                        right( LPAD(month( CURRENT_DATE( )),2,'0'),2),
                        right( LPAD(day( CURRENT_DATE( )),2,'0'),2));
    end if;
    if UCASE(flag) = 'W' then
        set currMidFix =CONCAT(RIGHT(year( CURRENT_DATE( )),yearlen),
                        right( LPAD(weekofyear( CURRENT_DATE( )),2,'0'),2));
    end if;


    if seq is null THEN
     set seq = 0;
    end if;
    if currMidFix <> midfix then
        set seq = 0;
    end if;
    set seq = seq + 1;

    START TRANSACTION;
    update sys_seq_ctrl set seq_midfix = currMidFix,seq_seq = seq  where seq_type = type;
    if(row_count()<=0) THEN -- row_count()
        rollback;
        set iret = 71;
        LEAVE leave_return;
    end if;
    if LENGTH (RTRIM(LTRIM(seq))) <= seqlen then
        set nbr =CONCAT( ltrim(rtrim(prefix)), ltrim(rtrim(currMidFix)),LPAD(seq,seqlen,'0'),ltrim(rtrim(suffix)));
    else
        set nbr =CONCAT( ltrim(rtrim(prefix)), ltrim(rtrim(currMidFix)), rtrim(ltrim(seq)),ltrim(rtrim(suffix)));

    end if;
    if LENGTH(ltrim(rtrim(nbr))) > maxlen then
        rollback;
        set iret = 73;
        LEAVE leave_return;
    end if;
    commit;
    set iret = 0;
end
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值