【问题标题】:Trigger error: Record "new" is not assigned yet触发错误:尚未分配记录“新”
【发布时间】:2017-08-12 07:08:53
【问题描述】:

我在 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

由于我只是执行了一次该过程,因此该解决方案不适用于我的情况。

感谢您的帮助!

【问题讨论】:

  • “该解决方案不适用于我的情况” - 为什么不呢?使用 STATEMENT 触发器影响多少行并不重要,您仍然没有 NEW 变量吗?
  • @RichardHuxton 你是对的!将其更改为 FOR EACH ROW 确实有效,我认为这意味着“为产品中的每一行调用一次程序”

标签: postgresql triggers insert


【解决方案1】:

解决方案确实是添加 FOR EACH ROW:

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

我假设 FOR EACH ROW 意味着对产品中的每一行调用该过程一次,而不是对插入的每一行。

【讨论】:

    猜你喜欢
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多