我正在尝试构建一个订单系统,该系统能够插入包含多个项目和金额的复合订单。我的数据库布局如下:我有一个order
表,其中包含一个自动递增的id
,item_id
,amount
和order_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
分配给所有订单?
提前感谢!
我建议您将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;