0

例如,我有一个用于记录的表。所以非常旧的数据是无用的,没有理由将其留在表中。例如,如果现有行数超过 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 之后,使用此触发器插入完全停止。

4

1 回答 1

1

您的触发器尝试写入DELETE它正在插入的同一个表(是写访问权限) - 这是不支持的。

由于您有BEFORE INSERT触发器,触发器的失败意味着INSERT.

您需要从不写入的操作中触发删除log,或者重新考虑您的模型。

于 2013-01-12T18:19:56.107 回答