2017-08-10 69 views
0

每周我想复制过去一周的所有数据,并将其插入到其他数据库中的表格中(表格中包含星期编号) 。使用存储过程和表变量名称创建事件

这使用存储procudure正常工作:

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”。

是否可以在事件中运行预准备语句?

如果没有,是否有更好的方法来将每周数据复制到一张表中,并在其名称中包含星期编号?

很多谢谢。

+0

为什么你想使用多个单独的表?如果您已正确编制索引,则使用单个应用程序的开销应该很小。如果您需要在不同的块设备上分配数据(并且不能使用LVM/RAID),那么您可以使用分区。 – symcbean

回答

1

您可以创建一个如下图所示的代码

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 ; 

然后调用使用事件过程如下图所示代码的存储过程。

有关它的基本知识你可以在这里查看MySQL Events and Time Duration

CREATE EVENT YOUR_EVENT_NAME 
    ON SCHEDULE EVERY 1 week 
    DO 
     CALL YOUR_PROCEDURE(); 
+1

您是否确认事件中不准备准备好的陈述? –

+0

很多谢谢,这是诀窍。 – EllBrandon

+0

@P.Salmon不知道,但我曾尝试过,它不适合我。 另外我也检查了这个https://forums.mysql.com/read.php?119,573071,573071 –