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有没有限制,或者我做错了什么!
检查“ID”字段的资本 - 如果它是在首都,那么你需要用同样的方式(通过引用它): INSERT INTO“结果“选择新。”ID“,NEW.name; – 2012-02-21 11:40:29
嗨米伦,是的,它是在大写字母,加入引用它的工作后,你可以请简要说明为什么我们需要这样做 – Murugesh 2012-02-21 12:12:20
[标识符和关键词](http://www.postgresql.org/docs/ current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS),查找“带引号的标识符”。 – 2012-02-21 13:29:51