2011-10-13 27 views
1

我有一個帶有串行(主鍵),文本,日期的表格當tresshold通過時觸發(MySQL)

它每隔一行就插入一次。

我的問題是,我的表不能包含少於80行和不超過100

我試着寫一些東西,但似乎我做的東西,我不應該這樣做:

CREATE TRIGGER checkForInsertBelow80 BEFORE INSERT ON log FOR EACH ROW 
BEGIN 
    IF (SELECT count(*) FROM log) >= 100 THEN 
    DELETE FROM log 
     WHERE serial in(SELECT serial from log order by serial ASC limit 10); 
    END IF  
END; | 

但首先我有語法錯誤,其次,我應該在最後一行之後這樣做。

有人可以幫助我把正確的方法和代碼放在一起嗎?

回答

1

1-存儲過程中的每個語句都必須以;終止。

2-您可以簡化刪除語句。

3-但是您不能更改觸發器內的同一個表,您只能在觸發器內更改其他表。

解決方案

使用黑洞表,並插入到的是,黑洞插入你的數據在日誌表,或者如果需要刪除的日誌條目。

CREATE TABLE bh_log (
    id integer null default null, 
    field1 varchar(255) not null, 
    other fields.... 
) ENGINE = BLACKHOLE; 

現在根據需要添加觸發器到黑洞表。

您需要一個INSERT觸發器,UPDATE和DELETES在原始日誌表上完成。

DELIMITER $$ 

CREATE TRIGGER ai_bh_log_each AFTER INSERT ON bh_log FOR EACH ROW 
BEGIN 
    DECLARE log_count INTEGER; 
    INSERT INTO log VALUES (NEW.id, NEW.field1, NEW......); 
    SELECT count(*) INTO log_count FROM log; 
    IF log_count > 100 THEN 
    //Delete the oldest entry 
    DELETE FROM log WHERE log.id IS NOT NULL ORDER BY id ASC LIMIT 1; 
    END IF; 
END $$ 

DELIMITER ; 

因爲每一行觸發器觸發您插入,你只需要在每個觸發器刪除1行至100%的行的總數不超過一個100

相關問題