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();