Mysql 使用存储过程和表变量名创建事件
我希望每周复制上一周的所有数据,并将其插入到另一个数据库的表中(表名中包含周数) 使用存储的过程,这可以很好地工作:Mysql 使用存储过程和表变量名创建事件,mysql,events,stored-procedures,Mysql,Events,Stored Procedures,我希望每周复制上一周的所有数据,并将其插入到另一个数据库的表中(表名中包含周数) 使用存储的过程,这可以很好地工作: SET @weekno:=WEEKOFYEAR(NOW()); SET @sql_text = concat('INSERT INTO archive.data_2017_week_',@weekno,' select * from live.data_archive where year(time) = 2017 AND week(time) = ',@weekno,''
SET @weekno:=WEEKOFYEAR(NOW());
SET @sql_text = concat('INSERT INTO
archive.data_2017_week_',@weekno,' select * from live.data_archive where
year(time) = 2017 AND week(time) = ',@weekno,'');
PREPARE stmt FROM @sql_text;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
然而,如果我尝试在phpMyAdmin中为此创建一个每周事件,我会得到MySQL“错误代码:1064”
是否可以在事件中运行准备好的语句
如果没有,是否有更好的方法将每周数据复制到名称中包含周数的表中
非常感谢。您只需创建一个存储过程,如下代码所示
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `YOUR_PROCEDURE`()
BEGIN
SET @weekno:=WEEKOFYEAR(NOW());
SET @sql_text = concat('INSERT INTO
archive.data_2017_week_',@weekno,' select * from live.data_archive where
year(time) = 2017 AND week(time) = ',@weekno,'');
PREPARE stmt FROM @sql_text;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;
然后使用事件调用该过程,如下代码所示
关于它的基本知识,你可以在这里查看
为什么要使用多个单独的表?如果您已经正确地为单个索引编制了索引,那么使用单个索引的开销应该是最小的。如果您需要在不同的块设备之间分发数据(并且不能使用LVM/RAID),那么您可以使用分区。您是否确认在事件中不允许使用准备好的语句?@P.Salmon不确定,但我已经尝试了相同的方法,它对我无效。我也检查过这个
CREATE EVENT YOUR_EVENT_NAME
ON SCHEDULE EVERY 1 week
DO
CALL YOUR_PROCEDURE();