簡體   English   中英

帶有 ON CONFLICT 子句的 Postgres 條件插入

[英]Postgres conditional insert with an ON CONFLICT clause

我有下表:

CREATE TABLE orders(
     order_id text primary key,
     payment_status text not null
)

如果它發生變化,我想更新payment_status:

INSERT INTO orders(
        order_id, 
        payment_status
)
VALUES(
        '101',
        'Paid'
)
ON CONFLICT (order_id) DO UPDATE SET
        payment_status = EXCLUDED.payment_status

有三種可能的付款狀態:

  • 等待付款
  • 有薪酬的
  • 已退款

ON CONFLICT 子句用於在訂單行從“已付款”更改為“已退款”時更新訂單行。 但是,該表應該只包含狀態為“已付款”或“已退款”的訂單行,而不是“等待付款”的行。 如果我在語句末尾指定 WHERE 條件為

WHERE EXCLUDED.payment_status != 'Awaiting payment'

此 where 條件僅適用於主鍵發生沖突時,而不適用於插入新的 order_id 時,從而讓具有“等待付款”狀態的訂單在第一次插入時傳遞。

我怎樣才能做這樣一個插入,只允許在第一個插入時插入某些 pay_status 值?

該表應僅包含狀態為“已付款”或“已退款”的訂單行,而不是“等待付款”的行。

CHECK約束是正確的解決方案,也不限於特定查詢。

CREATE TABLE orders(
     order_id text primary key,
     payment_status text not null CHECK (payment_status IN ('Paid', 'Refunded'))
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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