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