簡體   English   中英

PostgreSQL:使用視圖和觸發器在多個表中插入元組

[英]PostgreSQL: Inserting tuples in multiple tables using a view and a trigger

我正在嘗試構建一個訂單系統,該系統能夠插入由多個項目和數量組成的復合訂單。 我的數據庫布局如下:我有一個order表,包含一個自動增量iditem_idamountorder_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 STATEMENTnextval為序列調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM