MySQL関数生成オーダー番号

3689 ワード

文書ディレクトリ
  • 番号生成器基礎方法
  • 資金流水番号生成器
  • オーダー番号生成器
  • 実行上の注意事項
  • データテーブル
  • を作成する
    番号付けビルダーの基本方法
    CREATE DEFINER=`root`@`localhost` FUNCTION `f_app_seq`(`in_seq_name` varchar(16)) RETURNS varchar(16) CHARSET utf8
    BEGIN
    /***************************************
    *author felly
    *date 2019 6 24 14:40:02
    *       
    *      
    *************************************/
    DECLARE   v_d VARCHAR(16);
    DECLARE  v_i INT(5);
    DECLARE  app_no VARCHAR(16);
    DECLARE   temp VARCHAR(16);
    
     set v_i=6;
    
    set  v_d=right(DATE_FORMAT(now(),'%Y%m%d') ,6);
     
        UPDATE app_sequence SET seq_date=v_d,seq_value=0  WHERE seq_name=in_seq_name AND seq_date<>v_d;  
    
    	 UPDATE app_sequence SET seq_value=last_insert_id(seq_value+1)  WHERE seq_name=in_seq_name;   
    
    SET app_no= last_insert_id();   
    SET app_no=LPAD(app_no,6,'0') ;
     
    SET temp='';
    WHILE  v_i>=0   DO
     SET  temp=CONCAT(temp,MID(v_d,6-v_i,1),MID(app_no,6-v_i,1));
    
    SET v_i=v_i-1;
    END WHILE;
    
    
    RETURN  temp;
    END
    

    資金フロー番号生成器
    CREATE DEFINER=`root`@`localhost` FUNCTION `f_bill_no`() RETURNS varchar(16) CHARSET utf8
    BEGIN
    	/***************************************
    *author felly
    *date 2019 6 24 14:41:16
    *         
    
    *************************************/
    declare  app_no varchar(16);
    
    set app_no=f_app_seq('bill');
    	RETURN concat('2',app_no);
    END
    

    オーダー番号ビルダー
    CREATE DEFINER=`root`@`localhost` FUNCTION `f_order_no`() RETURNS varchar(16) CHARSET utf8
    BEGIN
    	/***************************************
    *author felly
    *date 2019 6 24 14:41:16
    *         
    
    *************************************/
    declare  app_no varchar(16);
    
    set app_no=f_app_seq('order');
    	RETURN concat('1',app_no);
    END
    

    実行上の注意
    3つの関数は段階的に順次実行する必要があります.同じ実行で一度に実行してはいけません.エラーが発生します.
    データテーブルの作成
    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- ----------------------------
    -- Table structure for app_sequence
    -- ----------------------------
    DROP TABLE IF EXISTS `app_sequence`;
    CREATE TABLE `app_sequence`  (
      `seq_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '  ID',
      `seq_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '    ',
      `seq_date` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '   ,  %Y%m%d  6 ',
      `seq_value` int(11) NULL DEFAULT 0 COMMENT '   ',
      `app_no` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '   ',
      `func_info` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '  ',
      `created_at` timestamp(0) NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '    ',
      `updated_at` timestamp(0) NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '    ',
      PRIMARY KEY (`seq_id`) USING BTREE
    ) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '     ' ROW_FORMAT = Compact;
    
    -- ----------------------------
    -- Records of app_sequence
    -- ----------------------------
    INSERT INTO `app_sequence` VALUES (1, 'order', '190802', 2, NULL, '         ', '0000-00-00 00:00:00', '0000-00-00 00:00:00');
    INSERT INTO `app_sequence` VALUES (2, 'bill', '190704', 1, '', '         ', '0000-00-00 00:00:00', '0000-00-00 00:00:00');
    
    SET FOREIGN_KEY_CHECKS = 1;
    
    select f_order_no()またはselect f_bill_no()を実行すると、番号が徐々に増加し、ステップ長が1であることがわかり、一意性が保証されます.
    考えが傾かない限り、方法は困難よりも多い.