不区分大小写的唯一性 - 如何更新当前记录,而不考虑大小写?
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 collation 或 citext
扩展名,并使用 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);
我在 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 collation 或 citext
扩展名,并使用 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);