[英]How to create an Archive Table with a Mysql Procedure and Date()
我嘗試創建一個每天運行一次的過程,並存儲更大表中的數據子集。 該表的名稱應使用CURDATE()動態創建。
DROP PROCEDURE daily_backup;
DELIMITER |
CREATE PROCEDURE daily_backup()
BEGIN
SET @tbl = CONCAT('items_data_', DATE_FORMAT(CURDATE(), '%Y%m%d'));
SET @s = CONCAT('DROP TABLE IF EXISTS ', @tbl);
PREPARE stmt FROM @s;
EXECUTE stmt;
@s = CONCAT('CREATE TABLE `', @tb1, '` (`id` int(11) NOT NULL,`up` mediumint(9) NOT NULL,`down` mediumint(9) NOT NULL) ENGINE=Archive');
PREPARE stmt FROM @s;
EXECUTE stmt;
SET @s = CONCAT('INSERT INTO ', @tbl, ' SELECT id,up,down FROM items;');
PREPARE stmt FROM @s;
EXECUTE stmt;
END
這些是結果
#1064-您的SQL語法有誤; 檢查與您的MySQL服務器版本相對應的手冊以獲取正確的語法,以在'@s = CONCAT('CREATE TABLE`',@ tb1,'`(`id` int(11)NOT NULL,`up` mediumint( 9)'在第8行
編輯 //現在工作
DROP PROCEDURE daily_backup;
DELIMITER |
CREATE PROCEDURE daily_backup()
BEGIN
SET @tbl = CONCAT('items_data_', DATE_FORMAT(CURDATE(), '%Y%m%d'));
SET @s = CONCAT('DROP TABLE IF EXISTS ', @tbl);
PREPARE stmt FROM @s;
EXECUTE stmt;
SET @s = CONCAT('CREATE TABLE `', @tbl, '` (`id` int(11) NOT NULL,`up` mediumint(9) NOT NULL,`down` mediumint(9) NOT NULL) ENGINE=Archive');
PREPARE stmt FROM @s;
EXECUTE stmt;
SET @s = CONCAT('INSERT INTO ', @tbl, ' SELECT id,up,down FROM items;');
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
變量分配始終需要使用SET
命令:
SET @s = CONCAT('CREATE TABLE `', @tbl, '` (`id` int(11) NOT NULL,`up` mediumint(9) NOT NULL,`down` mediumint(9) NOT NULL) ENGINE=Archive');
請注意,此語句中有@tb1
,應該為@tbl
。
在使用DEALLOCATE
准備好的語句后將其DEALLOCATE
也是一個好習慣,即
DEALLOCATE PREPARE stmt;
在EXECUTE stmt
之后
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.