PostgreSQL:使用视图和触发器在多个表中插入元组

问题描述 投票:1回答:1

我正在尝试构建一个订单系统,该系统能够插入包含多个项目和金额的复合订单。我的数据库布局如下:我有一个order表,其中包含一个自动递增的iditem_idamountorder_group_id列。我也有一个order_group表,其中包含一个自动增量id和一个person_id列。这个想法是,当一个人下订单时,将创建一个新的order_group条目,并将其id用作该人已完成的orders中的fk。

我认为通常可以在应用程序的代码中完成此操作。但是,我正在使用postgrest为我提供API,这建议创建一个自定义视图以通过该路由插入复合条目。描述为here

这是我到目前为止所拥有的:

CREATE FUNCTION kzc.new_order()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
    DECLARE
        group_id int;
    BEGIN
        INSERT INTO kzc.order_group (person) VALUES (new.person) RETURNING id AS group_id;
        INSERT INTO kzc."order" (item, amount, order_group) VALUES (new.item_id, new.amount, group_id);
        RETURN new;
    END;
$$;

CREATE TRIGGER new_order
INSTEAD OF INSERT ON kzc.new_order
FOR EACH ROW
EXECUTE FUNCTION kzc.new_order()

但是,此代码为复合插入中的每个ordergroup创建一个新的order。如何使代码只创建一个新的ordergroup条目并将其id分配给所有订单?

提前感谢!

sql postgresql triggers sql-view
1个回答
1
投票

我建议您将order_group_id列添加到new_order视图,并为该列定义一个默认值,该默认值将从序列中获取其值:

ALTER VIEW kzc.new_order
   ALTER order_group_id SET DEFAULT nextval('order_group_id_seq');

然后您在触发器中拥有该数字,并且可以将其用作order_group的主键。

为了避免多次添加行,请使用

INSERT INTO kzc.order_group (id, person)
   VALUES (NEW.order_group_id, NEW.person)
   ON CONFLICT (id) DO NOTHING;
© www.soinside.com 2019 - 2024. All rights reserved.