簡體   English   中英

使用INSERT ON CONFLICT跨多個列碰撞唯一約束,其中之一可能為null

[英]Colliding on unique constraint across multiple columns, one of which may be null, using INSERT ON CONFLICT

整個晚上

說我有一張桌子

CREATE TABLE test(
col_1 integer,
col_2 integer,
col_3 integer,
CONSTRAINT test_uk UNIQUE (col_1, col_2, col_3));

插入兩行;

INSERT INTO test (col_1 ,col_2 ,col_3) VALUES (1,2,NULL),(1,2,NULL);

這不會引發錯誤,因為postgres將null視為不相等。 我可以對這三列施加什么約束,以便使用更新進行碰撞

INSERT...... ON CONFLICT ... DO UPDATE...;

當前,查詢不會針對上述情況發生沖突,因為如上所述,空值不被視為相等。

提前致謝。

不是很經典,但是您可以將NULL合並為某些“保留”值,例如0或-1。 “保留”是指您知道它不會成為潛在列值的一部分的值。

create unique index idx_1 on test (coalesce(col_1,-1), coalesce(col_2,-1), coalesce(col_3,-1)); 

暫無
暫無

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

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