2012-02-21 25 views
1

我刚开始编写PL/pgSQL触发器函数。我有几个表称为学生和结果。学生有以下栏目。 ID,名称,主题,标志(ID是主键)和结果表是具有两列像ID,状态无法访问PostgreSQL中的主键值触发函数

每当一个记录在学生表有加,我想通过检查Student表中的标记来更新结果表。如果输入的标记大于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 “结果” SELECT NEW.ID, '失败';(或) 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有没有限制,或者我做错了什么!

+2

检查“ID”字段的资本 - 如果它是在首都,那么你需要用同样的方式(通过引用它): INSERT INTO“结果“选择新。”ID“,NEW.name; – 2012-02-21 11:40:29

+0

嗨米伦,是的,它是在大写字母,加入引用它的工作后,你可以请简要说明为什么我们需要这样做 – Murugesh 2012-02-21 12:12:20

+0

[标识符和关键词](http://www.postgresql.org/docs/ current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS),查找“带引号的标识符”。 – 2012-02-21 13:29:51

回答

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();