无法访问 PostgreSQL 触发函数中的主键值
Posted
技术标签:
【中文标题】无法访问 PostgreSQL 触发函数中的主键值【英文标题】:Not able to access the Primary Key value in PostgreSQL Trigger Function 【发布时间】:2012-02-21 11:35:13 【问题描述】:我刚刚开始编写 PL/pgSQL 触发器函数。我有几个名为 Student 和 Result 的表。学生有以下列。 ID,name,subject,mark(ID 是主键) 并且 Result 表有两列,如 ID,Status
每当在学生表中添加一条记录时,我想通过检查学生表中的标记来更新结果表,如果输入的标记大于 50,则应在结果表中插入一条记录,其 ID 和状态 = 通过,如果小于 50,则状态将失败。 我有以下触发功能来实现这一点
CREATE OR REPLACE FUNCTION "UpdateResult"() RETURNS trigger AS $BODY$
BEGIN
IF NEW.mark < 50 THEN
INSERT INTO "Result" SELECT 92,'fail';
RETURN NEW;
ELSE
INSERT INTO "Result" SELECT 92,'pass';
RETURN NEW;
END IF;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE STRICT SECURITY DEFINER
COST 100;
ALTER FUNCTION "UpdateResult"() OWNER TO postgres;
CREATE TRIGGER "Result"
AFTER INSERT
ON "Student"
FOR EACH ROW
EXECUTE PROCEDURE "UpdateResult"();
由于我对主键值进行了硬编码,因此通过此函数触发器已按预期工作。 但是当我像下面这样修改触发器函数中的 SQL 时
INSERT INTO "Result" SELECT NEW.ID,'fail';(或) INSERT INTO "Result" SELECT NEW.ID,'pass';
它会抛出类似
的错误> ***Record "new" has no field "id" Context : PL/pgSQL function
> "UpdateResult" line 3 at SQL statement***
意味着它能够从新变量而不是主键值中获取非主键值的值。谁能告诉我 PL/pgSQL 是否有限制,或者我做错了什么!
【问题讨论】:
检查“ID”字段的大小写 - 如果它是大写的,那么你需要以同样的方式使用它(通过引用它): INSERT INTO "Result" SELECT NEW."ID",NEW .name; 嗨 Milen.,是的,它是大写字母,添加引号后它正在工作,你能告诉我为什么我们需要这样做 Identifiers and Key Words,查找“引用标识符”。 @Milen 非常感谢您的帮助 【参考方案1】:只是一个提示:你为什么使用带引号的名字?这样做时,您必须注意大小写。
看看这是否有效:
CREATE OR REPLACE FUNCTION UpdateResult() RETURNS trigger AS $BODY$
BEGIN
IF NEW.mark < 50 THEN
INSERT INTO result (id, status) values (92,'fail');
RETURN NEW;
ELSE
INSERT INTO result (id, status) values (92,'pass');
RETURN NEW;
END IF;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE STRICT SECURITY DEFINER
COST 100;
ALTER FUNCTION UpdateResult() OWNER TO postgres;
CREATE TRIGGER Result
AFTER INSERT
ON Student
FOR EACH ROW
EXECUTE PROCEDURE UpdateResult();
【讨论】:
以上是关于无法访问 PostgreSQL 触发函数中的主键值的主要内容,如果未能解决你的问题,请参考以下文章