例如,我有一个用于记录的表。因此,非常旧的数据是无用的,没有理由将其留在表中。我想创建一个触发器,如果现有行数超过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之后,此触发器插入完全停止。
答案 0 :(得分:1)
您的触发器尝试写入同一个表(DELETE
是写访问权限),它正在插入 - 这是不受支持的。
如果您有BEFORE INSERT
触发器,则触发器失败意味着INSERT
失败。
您需要触发从操作中删除,不写入log
或重新考虑您的模型。