繁体   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