PostgreSQL触发器创建问题

时间:2015-08-08 23:11:48

标签: postgresql postgresql-9.4

我已经浏览了整个网络和堆栈溢出,尽管我试图做我认为我无法解决的问题。代码:

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

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

1 个答案:

答案 0 :(得分:3)

问题在于您正在混合命名约定。 原理很简单:双引号中的标识符区分大小写;不带引号的标识符不区分大小写。 因此ExpressionHistoryexpressionhistory相同,但"ExpressionHistory"ExpressionHistory不同。

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

相关问题