2013-01-12 14 views
0

例如我有一個用於記錄的表格。所以很舊的數據是無用的,沒有理由把它留在桌子上。我想創建一個觸發器,例如,如果現有行數超過10個,則會刪除舊行。我已經有了:如何在MySQL中使用觸發器來維護一定數量的行?

CREATE TABLE log (
    logId INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    firstLogin DATETIME NOT NULL, 
    lastLogin DATETIME NOT NULL, 
    fingerprint VARCHAR(64) CHARACTER SET BINARY, 
    ip VARCHAR(24) NOT NULL, 
    accountId INT UNSIGNED NOT NULL, 
    FOREIGN KEY (accountId) 
     REFERENCES accounts (accountId) 
     ON UPDATE CASCADE ON DELETE CASCADE, 
    PRIMARY KEY (logId) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

DELIMITER | 

CREATE TRIGGER logbeforeinsert BEFORE INSERT ON log 
    FOR EACH ROW 
     BEGIN 
      SET @rowcount = (SELECT COUNT(*) FROM log WHERE accountId = NEW.accountId); 
      IF @rowcount > 9 THEN 
       DELETE FROM log WHERE accountId = NEW.accountId LIMIT 1; 
      END IF; 
     END; 
| 

DELIMITER ; 

但是這個觸發插入停在所有行的數量達到了10後

回答

1

你觸發試圖寫入同一個表(DELETE是寫訪問),它正在插入 - 這不被支持。

因爲您有BEFORE INSERT觸發器,觸發器故障意味着INSERT故障。

您需要觸發刪除操作,不寫入log或重新考慮您的模型。

+0

這很糟糕。似乎一種方法是在應用程序邏輯中實現刪除操作。 –

+0

一個典型的方法:1.將清理邏輯放入一個存儲過程中,2.在INSERT後獲得'LAST_INSERT_ID()',3.如果lastInsertID mod N == 0調用清理存儲過程,N是一個合理的數字(例如1000) –

相關問題