1. 程式人生 > 資料庫 >MySQL之儲存過程按月建立表的方法步驟

MySQL之儲存過程按月建立表的方法步驟

具體不多說,直接上程式碼。歡迎一起交流和學習。

建立一個按月建立表的儲存過程,SQL語句如下:

DELIMITER // 
DROP PROCEDURE IF EXISTS create_table_by_month //
CREATE PROCEDURE `create_table_by_month`()
BEGIN

  #--提前申明變數,後面會用到
    DECLARE nextMonth varchar(20);
    DECLARE nextTABLE varchar(20);
    DECLARE csql varchar(5210);
    DECLARE outputParam int;
    DECLARE tableName_1 varchar(20);
    DECLARE tableName_2 varchar(20);
    DECLARE table_prefix varchar(20);

  #--獲取下個月
  SELECT SUBSTR(replace(DATE_ADD(CURDATE(),INTERVAL 1 MONTH),'-',''),1,6) INTO @nextMonth;
  #--對上面的SQL語句拆分分析:
  #MySQL時間函式date_add()為日期增加一個時間間隔,此sql的意思就是當前日期增加一個月後的日期
  #select DATE_ADD(CURDATE(),INTERVAL 1 MONTH); 
  ##返回20201006
  #select replace('2020-10-06','');
  ##返回20201006
  #select replace(DATE_ADD(CURDATE(),'');
  ##返回202010
  #SELECT SUBSTR(20201006,6);
  ##賦值到變數@nextMonth 中
  #SELECT SUBSTR(20201006,6) INTO @nextMonth;

# 表1
    #設定表字首變數值為td_user_banks_log_
    set @table_prefix = 'td_user_banks_log_';

    #定義表1的名稱
    SET @tableName_1 = CONCAT(@table_prefix,@nextMonth);
    ##定義建立表的SQL語句
    set @csql=concat("create table if not exists ",@tableName_1,"(
        `id` int(11) NOT NULL AUTO_INCREMENT,`app_id` varchar(100) NOT NULL,`user_id` int(11) NOT NULL DEFAULT '0' COMMENT '使用者ID',`type` tinyint(2) NOT NULL DEFAULT '1' COMMENT '1 簽到獎勵 2 活動獎勵 3 兌換',`gold_coin` int(11) NOT NULL,`remarks` varchar(200) NOT NULL DEFAULT '' COMMENT '備註',`create_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (`id`),KEY `app_id` (`app_id`),KEY `user_id` (`user_id`),KEY `type` (`type`),KEY `create_at` (`create_at`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");
  #PREPARE介紹:
  ##語句用於預備一個語句,並指定名稱statement_name,以後引用該語句。語句名稱對大小寫不敏感。
  ##preparable_stmt可以是一個文字字串,也可以是一個包含了語句文字的使用者變數。該文字必須表現為一個單一的SQL語句,而不是多個語句。
  PREPARE create_stmt from @csql; 
    EXECUTE create_stmt;
  DEALLOCATE PREPARE create_stmt;

# 表2 和表1是同樣的SQL,此處不做介紹:
    set @table_prefix = 'td_sign_log_';

    SET @tableName_2 = CONCAT(@table_prefix,@nextMonth);

    set @csql=concat("create table if not exists ",@tableName_2,"(
      `id` int(11) NOT NULL AUTO_INCREMENT,`user_id` int(11) NOT NULL,`day` int(11) NOT NULL DEFAULT '0' COMMENT '天',`sign_type` tinyint(2) NOT NULL DEFAULT '1' COMMENT '1 簽到 2 補籤 3 累計獎勵',`type` tinyint(2) NOT NULL DEFAULT '1' COMMENT '1 金幣',`num` int(11) NOT NULL DEFAULT '0',`data_id` int(11) NOT NULL DEFAULT '0',KEY `data_id` (`data_id`),KEY `create_at` (`create_at`),KEY `sign_type` (`sign_type`),KEY `day` (`day`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");

    PREPARE create_stmt from @csql; 
    EXECUTE create_stmt;
    DEALLOCATE PREPARE create_stmt;

    SELECT COUNT(1) INTO @outputParam FROM information_schema.`TABLES` WHERE TABLE_NAME in (@tableName_1,@tableName_2);
    SELECT @outputParam;

END //
delimiter ;
#--每月建立一個當月表的定時任務:

create EVENT `create_table_by_month` ON SCHEDULE EVERY 1 MONTH STARTS '2020-09-06 12:40:00' ON COMPLETION NOT PRESERVE ENABLE DO call create_table_by_month();

常識提示:在計劃任務中,某個具體的時間來呼叫儲存過程SQL1語句執行。這個指定的具體時間必須是將來的時間才可以的

#檢視建立儲存過程的SQL語句:

show create PROCEDURE create_table_by_month\G
#刪除儲存過程:

DROP PROCEDURE IF EXISTS create_table_by_month;
#刪除計劃任務

drop event create_table_by_month1;

以上儲存過程的SQL語句和定時器的SQL語句都是生產環境使用過的

#排查報錯:

發現mysql的日誌報錯,原來的儲存過程的SQL語句裡面增加的索引鍵欄位正好是表中不存在的欄位,所以包下面的錯誤。於是去掉儲存過程中的索引鍵欄位SQL就OK了。

2020-09-06T12:40:00.244879+08:00 604392 [ERROR] Event Scheduler: [root@localhost][test0001.create_table_by_month1] Key column 'sign_date' doesn't exist in table

2020-09-06T12:40:00.244926+08:00 604392 [Note] Event Scheduler: [root@localhost].[test0001.create_table_by_month1] event execution failed.

上述的儲存過程只是本博主線上業務環境的SQL,切勿直接套用,造成損失與本博文無關。鑑於學習交流初心發表此處,僅供大家學習交流參考用。

到此這篇關於MySQL之儲存過程按月建立表的方法步驟的文章就介紹到這了,更多相關MySQL 按月建立表內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!