2010-04-13 25 views
0

我要找的,將採取行年長則X天,並把它放在歸檔表... 正想着,使功能,因此這將是easer執行功能。 ..如果我管理由自己來寫吧:)MySQL的功能:旋轉舊條目存檔表

+0

什麼是你的問題?你剛剛告訴我們你會寫這個函數,並在完成時呈現它嗎?如果是這樣的話,這對SO來說不是一個有效的問題。 – 2010-04-13 08:22:35

+0

問題是,我不知道如果我能寫這樣的事...... 會嘗試後... – confiq 2010-04-13 08:25:46

回答

0

好吧,我定局寫的:) 我花了一段時間,但在這裏它是:

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `procedure`.`rotate_events_pro`$$ 
CREATE DEFINER=`confiq`@`%` PROCEDURE `rotate_events_pro`(p_threshold_rotate_row int,p_days_to_keep int,OUT p_message VARCHAR(200)) 
BEGIN 
    DECLARE v_id_to_move INT; 
    #lets take ID that we need to move 
    #we can't use variables in LIMIT, how smart MySQL! 
    SET @v_sql = CONCAT('SELECT max(id) 
     INTO @v_id_to_move 
     FROM events 
     WHERE event_created < DATE_ADD(CURDATE(), INTERVAL - ',p_days_to_keep,' DAY) OR 
     id < (SELECT min(id) FROM (SELECT id FROM events ORDER BY id DESC LIMIT ?) as id)'); 
    PREPARE stmt1 FROM @v_sql; 
    SET @param1 = p_threshold_rotate_row; 
    EXECUTE stmt1 USING @param1; 
     DEALLOCATE PREPARE stmt1; 
    #we have IDs that need to to be moved to arhive 
    IF @v_id_to_move > 0 THEN 
     START TRANSACTION; 
      INSERT INTO archived_events SELECT * FROM events WHERE id < @v_id_to_move; 
      INSERT INTO archived_eventsinfo SELECT * FROM eventsinfo WHERE event_id < @v_id_to_move; 
      DELETE FROM events WHERE id < @v_id_to_move; 
      DELETE FROM eventsinfo WHERE event_id < @v_id_to_move; 
     COMMIT; 
     SET p_message = CONCAT('moved all events that id is < ',@v_id_to_move); 
    ELSE 
     SET p_message = 'Nothing to move'; 
    END IF; 
END$$ 

DELIMITER ; 

隨意反饋或編輯自己使用:)

0

使用觸發器代替像

CREATE TABLE archive_NUMBER_OF_WEEK (...); 
INSERT INTO archive_NUMBER_OF_WEEK SELECT * FROM content WHERE DATE < X days; 
DELETE * FROM content WHERE DATE < X days 

將發佈。他們是爲了這些。

+1

沒了......我更願意提出申請的cronjob會照顧老項目,而不是的觸發器。表是這樣的觸發器太活躍...... – confiq 2010-05-07 15:15:52

1

如果你想用一個動態後綴命名存檔表(例如我認爲你在NUMBER_OF_WEEK的例子中是暗示的),那麼我會建議在bash/perl/python中編寫一個腳本來執行此操作,而不是使用一個MySQL存儲例程。

此外,如果你正在使用MySQL 5.1,你可能要考慮按日期分區的內容表,所以你可以很容易地刪除舊的分區,他們歸檔後。

+0

什麼你「按日期分區的內容表」意思? 任何關於這方面的文章? – confiq 2010-05-07 15:16:42

+0

@confiq:這裏有基於範圍的分區MySQL手冊。第4和第5的例子是基於日期:http://dev.mysql.com/doc/refman/5.1/en/partitioning-range.html – 2010-05-07 16:09:25