2014-06-11 74 views
0

嘗試創建觸發器,該刪除器將刪除90天前的任何記錄。我從stackoverflow中使用了一個觸發器語句,並且稍微改變了一下語句,但在我的MySQL Workbench中,出現語法錯誤。我似乎無法確定哪裏出了問題。創建觸發器刪除大於90天的行

下面是我的查詢:

create trigger user_connections_dump after insert on user_connections 
for each row 
begin 
    delete from connection_time where Date('2014-06-09') > Date('now','-90 days') 
end; 

回答

4

您的需求看起來更像是一個事件而不是觸發器。

CREATE EVENT IF NOT EXISTS `Clean_Older_Than_90_days_logs` 
ON SCHEDULE 
    EVERY 1 DAY_HOUR 
    COMMENT 'Clean up log connections at 1 AM.' 
    DO 
    DELETE FROM log 
    WHERE log_date < DATE_SUB(NOW(), INTERVAL 90 DAY) 

參考文獻: MySQL Event Scheduler on a specific time everyday

+0

只是想了解這個說法。還是數據庫和SQL的初級。所以基本上這句話是創建一個事件,每天凌晨1點它會刪除我的表中90天或更長的記錄是否正確?這是一個自動的事情嗎? – AznDevil92

+1

@ AznDevil92是的,如果你是MySQL的初級(因爲我也是),你需要檢查一些其他事情,比如事件調度器的狀態和東西。它很容易,你可以在這裏瞭解更多:http://dev.mysql.com/doc/refman/5.5/en/create-event.html。玩吧。 – celerno

+0

您如何知道此事件將在凌晨1點正好觸發?應該有類似於STARTS STR_TO_DATE(DATE_FORMAT(NOW(),'%​​Y%m%d 0100'),'%Y%m%d%H%i')+ INTERVAL 1 DAY – sbrbot

2
CREATE TRIGGER user_connections_dump 
AFTER INSERT ON user_connections 
FOR EACH ROW 
DELETE FROM log 
WHERE log_date < DATE_SUB(NOW(), INTERVAL 90 DAY) 

你應該在log表中可以比較的日期列,而不是字面的日期。然後使用DATE_SUB來減去日期,而不是Date函數。

+0

我用你的刪除查詢在我的回答如下。 – celerno

+0

感謝您的輸入,但是我得到一個語法錯誤,提示「意外的DELETE_SYM,期待FOR_SYM」 – AznDevil92

+1

顯然,在觸發器中需要「FOR EACH ROW」,即使它不依賴於該行。也許你應該使用事件調度器而不是觸發器。 – Barmar

0
CREATE EVENT IF NOT EXISTS `Delete_Older_Than_90_Days` 
    ON SCHEDULE EVERY 1 DAY 
    STARTS STR_TO_DATE(DATE_FORMAT(NOW(),'%Y%m%d 0100'),'%Y%m%d %H%i') + INTERVAL 1 DAY 
DO 
    DELETE LOW_PRIORITY FROM log WHERE log_date < DATE_SUB(NOW(),INTERVAL 90 DAY)