PostgreSQL 触发器创建问题

PostgreSQL Trigger creation issues

我查看了整个网络和 Whosebug,尽管尝试了我看到的所有内容,但我无法让它工作。代码:

CREATE TABLE "ExpressionHistory" (
ExpressionHistoryId SERIAL PRIMARY KEY,
ExpressionId INT NOT NULL,
UserId INT NOT NULL,
AccessDate TIMESTAMP NOT NULL,
CreatedBy VARCHAR(12) NOT NULL,
CreatedDate TIMESTAMP NOT NULL,
ModifiedBy VARCHAR(12) NOT NULL,
ModifiedDate TIMESTAMP NOT NULL);

ALTER TABLE "ExpressionHistory"
ADD CONSTRAINT FK_EXPRESSIONHISTORY_EXPRESSION
FOREIGN KEY ("expressionid")
REFERENCES "Expression";

CREATE OR REPLACE FUNCTION prune_expression_history() RETURNS TRIGGER AS $pruned_expression_history$
    BEGIN
        DELETE FROM ExpressionHistory WHERE ExpressionHistoryId = 
            (SELECT ExpressionHistoryId FROM ExpressionHistory WHERE 
            UserId = NEW.UserId AND
            (SELECT COUNT(1) FROM ExpressionHistory WHERE UserId = NEW.UserId) > 10
            ORDER BY AccessDate DESC 
            LIMIT 1 OFFSET 10 );
        RETURN NULL;
    END;
$pruned_expression_history$ LANGUAGE plpgsql;

CREATE TRIGGER PruneExpressionHistoryTable
    AFTER INSERT ON ExpressionHistory
    FOR EACH ROW
    EXECUTE PROCEDURE prune_expression_history();

错误:

ERROR:  relation "expressionhistory" does not exist
********** Error **********

ERROR: relation "expressionhistory" does not exist
SQL state: 42P01

因此,目标是在插入此 table 时,当在 table 上发生插入时,我会删除用户的最旧记录 10。我无法让触发器实例化,这显然是个问题。我怀疑这个问题很微妙,但我无法将其隔离。这发生在 CREATE TRIGGER 执行中。提前致谢。

问题是您混淆了命名约定。 原理很简单:双引号内的标识符区分大小写;不带引号的标识符不区分大小写。 所以 ExpressionHistoryexpressionhistory 相同,但 "ExpressionHistory"ExpressionHistory 不同。

您需要决定一个明确的命名约定。大多数 Postgres 用户更喜欢不带双引号(不区分大小写)的标识符。