mysql - 如何在MySQL中使用触发器维护一定数量的行?

标签 mysql

例如,我有一个用于记录日志的表。因此,非常旧的数据是无用的,没有理由将其保留在表中。我想创建一个触发器,如果​​现有行数超过 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/

相关文章:

php - 我的 iPhone 应用程序出现 "Certificate Invalid"错误

php - 是否可以使用 cygwin 在 windows 机器上完全模拟 linux web 服务器?

mysql - 错误 1005 无法创建添加外键的表

MySQL 查询 : Write max(Date) from whole table to each row

MySQL FK 语法 : insert column called practice into table cred_insurances that is FK to table practices

mysql - 如何在 customer 下创建一个引用 employer 表中的 "id"的列

mysql - 在 MySQL 存储过程中转到

php - MySQL 连接卡住运行时

mysql - 在cakephp 3中的mysql MONTH上生成单个字符串

mysql - 在组上选择 MAX() 不会返回相应的同级列