我在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();
答案 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
-- ...
使用保留字trigger
和function
作为触发器和函数名称(分别)也可能会遇到问题,我建议使用更好的名称或至少加双引号。