我有2个表(在同一POSTGRESQL数据库中)分别称为 Orders 和 Products 。他们或多或少看起来像这样:
产品:
-整数 id(主)
-文本描述
-数字单价
订单:
-整数 id(主)
-整数 productid(product.id的外键)
-整数数量(订购数量)
-数字总价(订单号*产品单价)
我需要的是一个程序,一旦数据库触发,该程序将更新缺少totalprice字段的字段。
到目前为止,我的过程看起来像这样:
CREATE PROCEDURE update_totalprice()
BEGIN
UPDATE Orders
SET Orders.totalprice=Orders.quantity*Products.unitprice
FROM Orders, Products
WHERE Orders.productid = Products.id AND Orders.totalprice = NULL
END;
然后我尝试创建数据库触发器以在表更改时重新调用该过程。
CREATE TRIGGER check_Orders
BEFORE UPDATE ON Orders
FOR EACH ROW
EXECUTE PROCEDURE update_totalprice();
这就是我遇到的困难,我不确定自己做错了什么...
修改:
找到 解决方案,最后它们都是语法错误。
函数本身看起来像这样:
CREATE OR REPLACE FUNCTION orders_totalprice() RETURNS TRIGGER AS $orders_totalprice$
BEGIN
UPDATE orders SET totalprice = NEW.numberofproducts * products.unitprice FROM products
WHERE NEW.productid = products.id;
IF NOT FOUND THEN RETURN NULL; END IF;
RETURN NEW;
END;
$orders_totalprice$ LANGUAGE plpgsql;
当触发器查询如下时:
CREATE TRIGGER trigger_orderstotalprice
AFTER INSERT ON orders
FOR EACH ROW EXECUTE PROCEDURE orders_totalprice();