0

我在 PostgreSQL 中有 2 个表:idlines,iditems,quantity)和项目iditems,stock)。iditems中的外键。当在行中插入新行时我需要一个触发器来更新items表中的stock字段。它应该用 stock=stock-quantity替换stock 。

我对 PostgreSQL 没有太多经验,但这是我所做的。不幸的是不工作。

DROP FUNCTION function() CASCADE ;
CREATE OR REPLACE FUNCTION function() 
RETURNS TRIGGER AS $trigger$
    BEGIN
      UPDATE items SET
      stock=COALESCE(stock,0)-lines.quantity
        WHERE lines.iditems=items.iditems;
        END;


CREATE TRIGGER trigger
    AFTER INSERT ON lines
    FOR EACH ROW
    EXECUTE PROCEDURE function();
4

1 回答 1

1

您可以访问行中的行触发器使用NEWOLD

NEW
数据类型RECORD;为行级触发器中的INSERT/操作保存新数据库行的变量。UPDATE这个变量NULL在语句级触发器和DELETE操作中。

OLD
数据类型RECORD;在行级触发器中为UPDATE/操作保存旧数据库行的变量。DELETE这个变量NULL在语句级触发器和INSERT操作中。

您可能想要使用NEW而不是lines返回新行:

UPDATE items
SET stock = COALESCE(stock, 0) - NEW.quantity
WHERE items.iditems = NEW.iditems;
return NEW;

您还需要正确终止函数定义:

-- ...
END;
$trigger$ language plpgsql;

CREATE TRIGGER trigger
-- ...

trigger您也可能会通过使用保留字以及触发器和函数名称(分别)遇到问题function,我建议您使用更好的名称或至少双引号。

于 2013-06-13T17:54:27.863 回答