MySql 定時任務和儲存過程,每月建立一張表
阿新 • • 發佈:2019-01-09
最近用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 ;
若有更好的方式,或者文中有錯誤,歡迎評論留言!