PostgreSQL股票更新触发器

时间:2013-06-13 17:30:34

标签: postgresql triggers

我在PostgreSQL中有2个表: idlines,iditems,quantity )和 iditems,stock )。 iditems 中的外键。 我需要一个触发器,当在中插入新行时,会从表中更新 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();

1 个答案:

答案 0 :(得分:1)

您可以使用NEW and OLD

访问行中的行触发器
  

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
-- ...

使用保留字triggerfunction作为触发器和函数名称(分别)也可能会遇到问题,我建议使用更好的名称或至少加双引号。