2017-08-10 70 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 –