Postgres UPSERT语法混乱

Postgres UPSERT syntax confusion

我有一个包含 2 列的 table: 频道文本 rowid 整数主键

我添加了频道索引 在我的table(较低的(频道))

上创建唯一索引channels_index

这样 VisitToronto 就会与 visittoronto 发生冲突

一切正常,冲突爆发。 错误:重复键值违反唯一约束 "channels_index" 详细信息:密钥 (lower(words))=(hello world) 已经存在。

我想不出捕获此冲突的语法。 ON CONFLICT 通道不起作用 ON CONFLICT ON CONSTRAINT channels_index 不起作用

我得到的最接近的是: 错误:没有匹配 ON CONFLICT 规范的唯一或排除约束

任何方向将不胜感激。

TIA

使用索引表达式,即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.