例如,我有一个用于记录日志的表。因此,非常旧的数据是无用的,没有理由将其保留在表中。我想创建一个触发器,如果现有行数超过 10,它将删除旧行。我已经拥有的:
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 后插入完全停止。
最佳答案
您的触发器尝试写入它正在插入的同一个表(DELETE
是写访问权限) - 不支持此操作。
由于您有一个 BEFORE INSERT
触发器,触发器失败意味着 INSERT
失败。
您需要从不写入日志
的操作中触发删除,或者重新考虑您的模型。
关于mysql - 如何在MySQL中使用触发器维护一定数量的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14296423/