溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在MySQL中如何實現按月創(chuàng)建表

發(fā)布時間:2020-11-04 16:01:22 來源:億速云 閱讀:452 作者:Leah 欄目:開發(fā)技術

MySQL中如何實現按月創(chuàng)建表?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

創(chuàng)建一個按月創(chuàng)建表的存儲過程,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(), INTERVAL 1 MONTH), '-', '');
  ##返回202010
  #SELECT SUBSTR(20201006,1,6);
  ##賦值到變量@nextMonth 中
  #SELECT SUBSTR(20201006,1,6) INTO @nextMonth;

# 表1
    #設置表前綴變量值為td_user_banks_log_
    set @table_prefix = 'td_user_banks_log_';

    #定義表1的名稱
    SET @tableName_1 = CONCAT(@table_prefix, @nextMonth);
    ##定義創(chuàng)建表的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,
      `app_id` varchar(100) NOT NULL,
      `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',
      `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 `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 ;
#--每月創(chuàng)建一個當月表的定時任務:

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語句執(zhí)行。這個指定的具體時間必須是將來的時間才可以的

#查看創(chuàng)建存儲過程的SQL語句:

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

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

drop event create_table_by_month2;

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

#排查報錯:

發(fā)現mysql的日志報錯,原來的存儲過程的SQL語句里面增加的索引鍵字段正好是表中不存在的字段,所以包下面的錯誤。于是去掉存儲過程中的索引鍵字段SQL就OK了。

2020-09-06T12:40:00.244879+08:00 604392 [ERROR] Event Scheduler: [root@localhost][test0001.create_table_by_month2] 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_month2] event execution failed.

看完上述內容,你們掌握在MySQL中如何實現按月創(chuàng)建表的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI