【发布时间】:2019-02-13 21:08:07
【问题描述】:
我有一个带有 code 列的数据库表,该列使用小写索引来防止代码值仅在大小写上有所不同(例如,'XYZ' = 'xYZ' = 'xyz')。 Postgresql 中的典型方式是创建基于函数的索引,如下所示:CREATE UNIQUE INDEX mytable_lower_code_idx ON mytable (lower(code))。
现在我需要在该列上进行 upsert 行为:
-- first insert
INSERT INTO mytable (code) VALUES ('abcd');
-- second insert, with upsert behaviour
INSERT INTO mytable (code) VALUES ('Abcd')
ON CONFLICT (code) DO UPDATE
SET code='Abcd';
对于第二次插入,我得到一个唯一键违规:ERROR: duplicate key value violates unique constraint "mytable_lower_code_idx"
(我也尝试使用ON CONFLICT ON CONSTRAINT mytable_lower_code_idx,但 Postgresql 告诉我此约束不存在,因此它可能不会将索引视为约束。)
我的最后一个问题:有什么方法可以使 INSERT ... ON CONFLICT 与表达式索引一起工作?或者我必须引入一个物理索引的小写列来完成任务?
【问题讨论】:
标签: postgresql unique-constraint lowercase upsert