1. 程式人生 > >MySql 定時任務和儲存過程,每月建立一張表

MySql 定時任務和儲存過程,每月建立一張表

最近用MySQL做了一個每月1號00:00:00建立一張表並將上個月的表資料匯入到新建立的表中,在此做個小記。

1. 要做這個之前先要:

    -- 設定好時區
    set time_zone = '+8:00';
    -- 開啟事件排程器
    set GLOBAL event_scheduler = 1;
    -- 選擇資料庫
    use test;

2. 先建立一個儲存過程或者函式:

-- 建立owner_info_month表的儲存過程

CREATE PROCEDURE create_owner_info_table_every_month()

BEGIN

SET
@dateStr = DATE_FORMAT(NOW(), '%Y_%m');
SET @nowDateStr = DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 MONTH),'%Y_%m'); SET @createStr = CONCAT("CREATE TABLE owner_info_" ,@dateStr, "(`owner_id` varchar(32) NOT NULL DEFAULT '業戶編號必須唯一', `owner_name` varchar(100) DEFAULT NULL COMMENT '業戶名稱', `business_id` varchar(100) DEFAULT NULL COMMENT '經營許可證編號', `owner_tel` varchar(30) DEFAULT NULL COMMENT '聯絡電話', `address` varchar(200) DEFAULT NULL COMMENT '所在地址', `create_time` datetime DEFAULT NULL COMMENT '記錄日期', PRIMARY KEY (`owner_id`), UNIQUE KEY "
);
SET @keyStr = CONCAT(" PK_GOV_OWNER_INFO_" ,@dateStr,"(`owner_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); SET @OwnerInfo = concat(@createStr ,@keyStr); PREPARE stmt FROM @OwnerInfo; EXECUTE stmt; -- 將上個月的表資料匯入到新建立的表中; SET @tableName = CONCAT("owner_info_" ,@dateStr); SET @InsertStr = CONCAT("insert into "
, @tableName, "(owner_id, owner_name,business_id, owner_tel,address,create_time,) select owner_id, owner_name, business_id,owner_tel, address,create_time from owner_info_" ,@nowDateStr);
PREPARE stmt FROM @InsertStr; EXECUTE stmt; END ;

建立的第二個儲存過程:

-- 建立vehicle_info_month表的儲存過程
CREATE PROCEDURE create_vehicle_info_table_every_month ()
BEGIN

SET @dateStr = DATE_FORMAT(NOW(), '%Y_%m');

SET @nowDateStr = DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 MONTH),'%Y_%m');

SET @createStr = CONCAT("CREATE TABLE vehicle_info_",@dateStr,
                    "(`vehicle_id` varchar(50) NOT NULL COMMENT '車輛唯一標識',
                    `vehicle_name` varchar(30) NOT NULL COMMENT '車牌號',
                    `color` smallint(5) NOT NULL DEFAULT '2' COMMENT '車牌顏色',
                    `owner_id` varchar(32) DEFAULT NULL,
                    `vehicle_type` varchar(10) DEFAULT NULL COMMENT '車輛型別類別編碼',
                    `create_time` datetime DEFAULT NULL COMMENT '記錄日期',
                    PRIMARY KEY (`vehicle_id`),");

SET @keyStr1 = concat(" KEY idx_gv_oid_",@dateStr,"(`owner_id`),");

SET @keyStr2 = concat(" KEY idx_gv_trans_type_",@dateStr,"(`vehicle_type`),");

SET @keyStr3 = concat(" KEY idx_gv_trans_vname_",@dateStr,"(`vehicle_name`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;");

SET @VehicleInfo = concat(@createStr ,@keyStr1 ,@keyStr2 ,@keyStr3);

PREPARE stmt FROM @VehicleInfo;

EXECUTE stmt;

-- 將上個月的表資料匯入到新建立的表中;

SET @tableName = CONCAT("vehicle_info_" ,@dateStr);

SET @InsertStr = CONCAT("insert into ",
                    @tableName,
                    "(vehicle_id, vehicle_name, color, owner_id,vehicle_type,create_time) 
                    select vehicle_id, vehicle_name, color, owner_id,vehicle_type,create_time
                    from vehicle_info_" , @nowDateStr);

PREPARE stmt FROM @InsertStr;

EXECUTE stmt;

END;

3. 建立定時任務或者叫排程器事件:


-- 建立定時任務
-- 以$$作為分隔符
DELIMITER $$  
SET GLOBAL event_scheduler = 1;  
-- 事件名
CREATE EVENT event_create_table_every_month
-- 間隔一個月  
ON SCHEDULE EVERY 1 MONTH
-- 第一次執行時間
STARTS date_add(date_add(date_sub(curdate(),interval day(curdate())-1 day), interval 1 month),interval 0 hour) 
ON  COMPLETION  PRESERVE  
ENABLE  
DO  
BEGIN  
-- 要呼叫的函式或者儲存過程
CALL create_owner_info_table_every_month();  
CALL create_vehicle_info_table_every_month();  
END $$  
-- 將分隔符重置為;
DELIMITER ;

若有更好的方式,或者文中有錯誤,歡迎評論留言!