Postgres upsert避免第二个唯一约束?

问题描述 投票:0回答:1

我有一个表格的形式(基于):

create table foo (
  name text unique,
  ref_id int,
  mod_time timestamptz
);

我希望能够插入其中,但是如果正在使用(mod_timename)对,则更新ref_id,如果另一个name使用了ref_id,则更新失败。

我可以通过如下创建另一个唯一约束来做到这一点:

alter table foo add unique (name, ref_id);

然后

insert into foo values ( $1, $2, $3 )
on conflict (name, ref_id) do update set
  mod_time = excluded.mod_time;

将根据需要运行:

  • 如果有新名称,请插入
  • 如果使用相同的名称和ref_id,则更改mod_time
  • 如果不同ref_id的名称相同,则失败
  • 但是,成本是第二唯一索引,实际上对于执行约束来说是多余的,因为name唯一的记录将自动由nameref_id唯一。是否有一些解决方法可以让我在没有第二个索引的情况下,也没有到数据库的其他往返操作获得此行为?

我有一个表格(基于)的表:create table foo(名称文本唯一,ref_id int,mod_time timestamptz);我希望能够插入其中,但是如果(...

postgresql unique-constraint upsert
1个回答
0
投票

这取决于您的失败意思。如果在这种情况下不执行任何操作也可以:where If same name for different ref_id,则可以执行以下操作:

© www.soinside.com 2019 - 2024. All rights reserved.