[英]PostgreSQL: Inserting tuples in multiple tables using a view and a trigger
我正在嘗試構建一個訂單系統,該系統能夠插入由多個項目和數量組成的復合訂單。 我的數據庫布局如下:我有一個order
表,包含一個自動增量id
、 item_id
、 amount
和order_group_id
列。 我還有一個order_group
表,其中包含一個自動增量id
和一個person_id
列。 這個想法是,當一個人訂購時,會創建一個新的order_group
條目,並將其id
用作該人已完成的orders
中的 fk。
我認為這通常會在應用程序的代碼中完成。 但是,我使用 postgrest 為我提供了一個 API,它建議創建一個自定義視圖以通過該路由插入復合條目。 這在此處進行了描述。
這是我到目前為止:
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
分配給所有訂單?
提前致謝!
我建議您在new_order
視圖中添加一個order_group_id
列並為其創建一個序列。 然后為該列創建一個DEFAULT
值:
ALTER VIEW kzc.new_order
ALTER order_group_id SET DEFAULT currval('order_group_id_seq');
添加一個BEFORE INSERT
觸發器FOR EACH STATEMENT
, nextval
為序列調用nextval
。 currval
調用都將獲取相同的生成值。
然后您在觸發器中擁有該數字,並且可以將其用作order_group
的主鍵。
為避免多次添加行,請使用
INSERT INTO kzc.order_group (id, person)
VALUES (NEW.order_group_id, NEW.person)
ON CONFLICT (id) DO NOTHING;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.