UPSERT 到唯一列中具有不同空值的表中

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

我必须将其更新到以下形式的表格中:

CREATE TABLE test_table (
  col1 varchar
, col2 varchar
, col3 varchar
, col4 varchar
)

条件是

(col1, col2, col3)
应该是唯一的,并且应该允许不同的空值。

我尝试过使用唯一索引。我认为我们需要有一个约束,因为我们需要更新插入到表中。但是在更新插入表时使用下面的索引很慢:

create unique index idx on test_table (
    coalesce(col1, 'null')
  , coalesce(col2, 'null')
  , coalesce(col3, 'null')
   );
postgresql database-design upsert unique-index
1个回答
0
投票

从 Postgres 15 开始,带有添加子句

NULLS NOT DISTINCT
的普通唯一索引可以实现您的要求。您不再需要
COALESCE
表达式上更昂贵的函数索引:

CREATE UNIQUE INDEX idx ON test_table(col1,col2,col3) NULLS NOT DISTINCT;

它简化并加速了

INSERT ... ON CONFLICT ... DO UPDATE ...
(俗称“UPSERT”)的连接使用。
它还消除了替换值“null”的歧义。
参见:

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