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 に答える