不区分大小写的唯一性 - 如何更新当前记录,而不考虑大小写?

case insensitive uniqueness - how to update against the current record, regardless of case?

我在 Postgres 之上使用 Hasura 来存储公司和其他信息。源数据具有相同的记录拼写,但大小写不同 - 例如:

name country
Reckitt Benckiser (Aust) Pty Ltd US
RECKITT BENCKISER (AUST) PTY LTD AU

我有公司名称的索引:

CREATE UNIQUE INDEX name_company_unique_idx on company (LOWER(name));

当我“更新”第二条记录时,它抛出一个唯一性错误,所以索引工作正常。但是我想要的是第二个记录实现第一个记录是同一件事,并将国家更新为 AU。如果我没有索引,我会在不同的情况下获得同一实体的两条记录。

我不想以大写或小写形式存储所有内容,但很高兴它采用插入的第一条记录的任何大小写。

如何使 upsert 过程与大小写无关?

您可以对 table 列使用 case insensitive collationcitext 扩展名,并使用 INSERT ... ON CONFLICT 和对该列的普通唯一约束。

您没有指定您的 Postgres 版本 运行,但如果是 12 或更高版本,您可以添加一个虚拟(生成的)列,然后对该列设置唯一约束。见 example:

alter table table_name add v_company_name text generated always as ( lower(company_name) stored);
alter table table_name add constraint company_name_bk unique (v_company_name);