2017-08-11 15 views
1

私は2列のテーブル: チャネルTEXT 行ID INTEGER PRIMARY KEYPostgresのUPSERT構文混乱

Iチャンネル MYTABLEに一意のインデックスchannels_index CREATE(低級(チャンネル))

にインデックスを含ま

VisitTorontoはvisittorontoと競合します

すべてがうまく動作し、競合が発生します。 エラー:重複するキー値が一意の制約 "channels_index"に違反しています DETAIL:キー(下位(ワード))=(hello world)は既に存在します。

この競合をトラップする構文を理解できません。 CONFLICTチャンネルの制約のchannels_index ON CONFLICT上では動作しません、私が持っている最も近いです

を動作しません: ERROR:ONのCONFLICT仕様

に一致するユニークまたは除外制約がありません任意の方向を希望感謝する。

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を返す方法はありますか?そうでなければ、データベースにあるバージョンは気にしません。ほとんどの場合、自分自身を教育しています。私は挿入と更新の両方のために返される更新ステートメントの後に '返すchannels_rowid'を使用していますが、もし私が "DO NOTHING"を返していない場合は、SELECTを使用するとエラーが発生します – Jym

+0

残念ながら、どの行も影響を受けていないので「何もしない」から。これを達成するには関数が必要です。 – klin

+0

ありがとう、十分に良い:-) – Jym