2017-08-11 104 views
1

我有2列的表格: 通道TEXT ROWID INTEGER PRIMARY KEYPostgres的UPSERT語法混亂

我包括在信道 CREATE mytable上UNIQUE INDEX channels_index(低級(信道))

索引所以VisitToronto將與visittoronto發生衝突

一切正常,衝突火起來。 錯誤:重複鍵值違反唯一約束「channels_index」 細節:鍵(低(詞))=(hello world)已經存在。

我找不出解決這個衝突的語法。 ON渠道衝突上不衝突對約束channels_index工作不工作

我得到的最接近是: 錯誤:沒有獨特的或排他條件相匹配的ON衝突規範

任何方向將不勝感激。

TIA

回答

0

使用索引表達式,即lower(channels)

insert into my_table (channels) values 
('VisitToronto'); 

insert into my_table (channels) 
values ('visittoronto') 
on conflict (lower(channels)) do 
update set channels = excluded.channels; 

select * 
from my_table; 

id | channels 
----+-------------- 
    1 | visittoronto 
(1 row) 

您不能使用約束,因爲該指數是一個表達式。在Postgres無法創建約束的情況下:

alter table my_table add constraint channels_unique unique using index channels_index; 

ERROR: index "channels_index" contains expressions 
LINE 1: alter table my_table add constraint channels_unique unique u... 
           ^
DETAIL: Cannot create a primary key or unique constraint using such an index. 
+0

非常感謝。我現在也明白了Docs的更好一點。有沒有辦法在不更新的情況下返回channels_rowid?如果不是這樣,我真的不關心數據庫中的哪個版本,主要是教育自己。我在返回插入和更新的update語句之後使用'返回channels_rowid',但如果我「不做任何」它不返回,如果我使用SELECT,我得到一個錯誤 – Jym

+0

不幸的是,你不能返回任何東西從「無所作爲」,因爲沒有行受到影響。你需要一個功能來完成這個。 – klin

+0

謝謝,夠好了:-) – Jym