web-dev-qa-db-ja.com

トリガーエラー:レコード「新規」はまだ割り当てられていません

Postgresqlに次のコードがあります:

CREATE OR REPLACE FUNCTION update_category() RETURNS trigger AS $newProduct$
BEGIN
    UPDATE category SET product_count = product_count + 1 WHERE cat_id = NEW.cat_id;
    INSERT INTO notification (content, type, p_id) VALUES('new product', 1, NEW.p_id);
    RETURN NEW;
END;
$newProduct$ LANGUAGE plpgsql;

CREATE TRIGGER update_cat AFTER INSERT ON product
    EXECUTE PROCEDURE update_category();

そして、製品にレコードを挿入した後、エラーが発生します。

[2017-03-20 16:05:05] [55000] ERROR: record "new" is not assigned yet
[2017-03-20 16:05:05] Detail: The Tuple structure of a not-yet-assigned record is indeterminate.
[2017-03-20 16:05:05] Where: SQL statement "UPDATE category SET product_count = product_count + 1 WHERE cat_id = NEW.cat_id"
[2017-03-20 16:05:05] PL/pgSQL function update_category() line 3 at SQL statement

私は解決策を探しましたが、エラーが原因である場合のみを見つけました

FOR EACH STATEMENT

の代わりに使用されています

FOR EACH ROW

プロシージャを1回実行するだけなので、このソリューションは私の場合には適用されません。

ご協力いただきありがとうございます!

8
Zain Virani

解決策は確かに各行に追加することでした:

CREATE TRIGGER update_cat AFTER INSERT ON product
    FOR EACH ROW EXECUTE PROCEDURE update_category();

FOR EACH ROWは、挿入された行ごとではなく、製品の行ごとに1回プロシージャを呼び出すことを意味すると想定しました。

7
Zain Virani