非主キー増分シーケンスは、ゼロからスタートする必要が毎日のデータベースに保存されました

タイトルは説明する方法を知っているので、それをすることはありません。

要件:

    

 ソリューション:

        1、新しいテーブル

CREATE TABLE `man_busi_code` (
  `busi_type` int(11) NOT NULL COMMENT '类型id',
  `busi_desc` varchar(255) DEFAULT NULL COMMENT '描述',
  `prefix` varchar(255) DEFAULT NULL COMMENT '前缀',
  `suffix` varchar(255) DEFAULT NULL COMMENT '后缀',
  `granularity` int(11) NOT NULL DEFAULT '0' COMMENT '时间粒度 0 不按时间 1 日 2 月 3 季 4 年',
  `gen_time` date DEFAULT NULL COMMENT '时间',
  `gen_val` int(11) NOT NULL DEFAULT '1' COMMENT '序列',
  `extent` int(11) NOT NULL DEFAULT '1' COMMENT '填充位数'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

    注:タイプID:フィールドを識別します。例えば、今宣言シリアルナンバーその一つに統一することができます。次回は、あなたは、2になるように、複数の一般的な需要を設定することができ、シリアル番号を購入する必要があります。

           接頭辞、接尾辞:自動的に返されたシリアル番号の前と後のステッチ。私はここにある空です。

           時間精度:毎日または0から始まる月次ベースで、というように。例えば、1の場合、最初の操作は、私が数000000に戻って次の日には、再び開始します。

           数字を充填:つまり、あなたは番号の長さを返すようにしたいです。私は6桁のシリアル番号が必要な場合たとえば、その後、値は6です。

データベースで関数を作成します。2.:

(ストアドプロシージャ?)

CREATE PROCEDURE `f_generator_busi_code`(IN i_busi_type int, OUT v_code varchar(50))
BEGIN

DECLARE v_cnt int DEFAULT 0;  
DECLARE v_granularity int;
DECLARE v_fmt varchar(50);
    set v_code='';
  START TRANSACTION; 
   select count(*)
      into v_cnt
      from man_busi_code
     where busi_type = i_busi_type;
     if v_cnt > 0 then
    select distinct granularity
      into v_granularity
      from man_busi_code
     where busi_type = i_busi_type;


   case v_granularity  
   when 0 then   
   
      select CONCAT( IFNULL(t.prefix,''), lpad(t.gen_val + 1, t.extent, '0'),IFNULL(t.suffix,'')) 
        into v_code
        from man_busi_code t
       where t.busi_type = i_busi_type ;

      update man_busi_code t
         set t.gen_val = t.gen_val + 1
       where t.busi_type = i_busi_type;
   when 1 then  
   
    SET v_fmt='%Y%m%d';
   when 2 then  
   
    SET v_fmt='%Y%m';
   when 3 then 
   
        select CONCAT( IFNULL(t.prefix,''), DATE_FORMAT(now(),'%Y'),quarter(now()),lpad(t.gen_val + 1, t.extent, '0'),IFNULL(t.suffix,'')) 
            into v_code
            from man_busi_code t
           where 
            CONCAT(DATE_FORMAT(t.gen_time,'%Y'),quarter(t.gen_time))=CONCAT(DATE_FORMAT(now(), '%Y'),quarter(now()))
            and t.busi_type = i_busi_type LIMIT 1;
        if LENGTH(v_code)>0 then 
          update man_busi_code t
            set t.gen_val = t.gen_val + 1
          where CONCAT(DATE_FORMAT(t.gen_time,'%Y'),quarter(t.gen_time))=CONCAT(DATE_FORMAT(now(), '%Y'),quarter(now()))
            and t.busi_type = i_busi_type;
        else
          select CONCAT( IFNULL(t.prefix,''), DATE_FORMAT(now(),'%Y'),quarter(now()),lpad(1, t.extent, '0'),IFNULL(t.suffix,'')) 
            into v_code
            from man_busi_code t
           where  t.busi_type = i_busi_type LIMIT 1;
           insert into man_busi_code(
            busi_type,   busi_desc,   prefix, suffix,   granularity,   gen_time, gen_val,  extent
            )  select t.busi_type ,t.busi_desc,t.prefix ,t.suffix,t.granularity,NOW(),1,t.extent from man_busi_code t 
            where t.busi_type=i_busi_type LIMIT 1;
        end if;
   when 4 then 
   
    SET v_fmt='%Y';
   end case;
       if v_granularity != 3 and v_granularity != 0 then
       
          select CONCAT( IFNULL(t.prefix,''), DATE_FORMAT(now(),v_fmt),lpad(t.gen_val + 1, t.extent, '0'),IFNULL(t.suffix,'')) 
            into v_code
            from man_busi_code t
           where 
            DATE_FORMAT(t.gen_time,v_fmt)=DATE_FORMAT(now(), v_fmt )
            and t.busi_type = i_busi_type LIMIT 1;
       if LENGTH(v_code)>0 then 
       
          update man_busi_code t
            set t.gen_val = t.gen_val + 1
            where DATE_FORMAT(t.gen_time,v_fmt)=DATE_FORMAT(now(), v_fmt ) and t.busi_type = i_busi_type;
       else
        
        select CONCAT( IFNULL(t.prefix,''), DATE_FORMAT(now(),v_fmt),lpad(1, t.extent, '0'),IFNULL(t.suffix,'')) 
            into v_code
            from man_busi_code t
           where t.busi_type = i_busi_type limit 1;

        insert into man_busi_code(
            busi_type,   busi_desc,   prefix, suffix,   granularity,   gen_time, gen_val,  extent
            )  select t.busi_type ,t.busi_desc,t.prefix ,t.suffix,t.granularity,NOW(),1,t.extent from man_busi_code t 
            where t.busi_type=i_busi_type LIMIT 1;
        end if;
   end if;
   end if;
   COMMIT;
    if LENGTH(v_code)=0 then 
        set v_code='没有找到代码';
   end if;
END

 あなたが返される値をスプライスすることができ、以下では、例えば、私は(この時間v_fmtで=「%Y」)を年の現在の数に戦うことになる返されたデータの途中で、途中で(今()、v_fmt)DATE_FORMATを追加しました

 3、Javaプログラムの呼び出し:

        私は、アノテーションベースの方法を使用します。

           マッパ層:     

@Select(value = "{call f_generator_busi_code( #{input, mode=IN, jdbcType=INTEGER}, #{output, mode=OUT, jdbcType=VARCHAR} )}")
    @Options(statementType = StatementType.CALLABLE)
    public void getShenpin(Map map);

               サービス層:

    @Transactional(readOnly = false, rollbackFor = Exception.class)
    public Map test(Map map){

        map.put("input", 1);
        map.put("output", "");
       tbRegistInfoMapper.getShenpin(map);

        return map;
    }

      パラメータ入力、承認の現在時刻を表すシリアル番号は、タイプIDの上にあります。出力は数に戻ります。それはtbRegistInfoMapper.getShenpin(マップ)と呼ばれてきた。(「出力」)map.getを呼び出した後に必要な値を返します。

4、使用前には、あなたがデータと結合されたデータテーブルにシードを追加する必要があり、将来的には、の制御を持っていません。

私たち建築家は私に今売却する方法を教え、ハハ!

公開された39元の記事 ウォンの賞賛6 ビュー30000 +

おすすめ

転載: blog.csdn.net/qq_40155654/article/details/95738743