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.
我有一个包含 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.