无法访问 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 触发函数中的主键值的主要内容,如果未能解决你的问题,请参考以下文章

访问表单无法传递视图的主键(到 SQL 服务器)

配置 JPA 让 PostgreSQL 生成主键值

先获取代码中任意实体的主键值

通过只知道模式和表名来删除 postgresql 中的主键约束

PostgreSQL中使用UUID

如何用java中取到作为数据库主键的值?