PL/pgSQLトリガ機能の作成を開始しました。私は学生と結果と呼ばれるテーブルのカップルを持っています。次の列を持つ生徒。 ID、名前、件名、マーク(IDが主キーである)および結果表がID、一つのレコードは、学生のテーブルに追加されているときはいつでもPostgreSQLトリガーファンクションのプライマリキー値にアクセスできない
は、私が欲しいステータスのような2つの列を持っていますStudentテーブルのマークをチェックしてResultテーブルを更新するには、入力したマークが50より大きい場合、IDとStatus = PassのResultテーブルに1つのレコードを挿入し、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"();
を達成するために、次のトリガ機能を持っています。 しかし、私は "結果" NEW.IDをSELECT INTO次
INSERTのようなトリガ関数内でSQLを変更すると、 '失敗します';(または) INSERT INTO "結果" 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; –
こんにちはMilen。はい、それは大文字で、引用符を追加した後に動作しています。私はこのようにする必要がある理由をお知らせください。 – Murugesh
[識別子とキーワード](http://www.postgresql.org/docs/ current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS)は、 "quoted identifier"を探します。 –