我必须将其更新到以下形式的表格中:
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')
);
从 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”)的连接使用。