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 执行中。提前致谢。
问题是您混淆了命名约定。
原理很简单:双引号内的标识符区分大小写;不带引号的标识符不区分大小写。
所以 ExpressionHistory
与 expressionhistory
相同,但 "ExpressionHistory"
与 ExpressionHistory
不同。
您需要决定一个明确的命名约定。大多数 Postgres 用户更喜欢不带双引号(不区分大小写)的标识符。
我查看了整个网络和 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 执行中。提前致谢。
问题是您混淆了命名约定。
原理很简单:双引号内的标识符区分大小写;不带引号的标识符不区分大小写。
所以 ExpressionHistory
与 expressionhistory
相同,但 "ExpressionHistory"
与 ExpressionHistory
不同。
您需要决定一个明确的命名约定。大多数 Postgres 用户更喜欢不带双引号(不区分大小写)的标识符。