Postgres 不区分大小写的唯一键约束:什么是快速选项?

问题描述 投票:0回答:1

我想在大表上有一个不区分大小写的唯一键。

我正在寻找最快的方法。

我找到了两个选项:

my_table_a
带有生成的列和
my_table_b
带有唯一索引

CREATE TABLE my_table_a
(
  my_table_id_a int GENERATED ALWAYS AS IDENTITY
    CONSTRAINT pk_my_table_a PRIMARY KEY,
  name text NOT NULL,
  key text GENERATED ALWAYS AS (LOWER(name)::text) STORED NOT NULL
);

CREATE TABLE my_table_b
(
  my_table_id_b int GENERATED ALWAYS AS IDENTITY
    CONSTRAINT pk_my_table_b PRIMARY KEY,
  name text NOT NULL
);

CREATE UNIQUE INDEX unique_name ON my_table_b (LOWER(name));

但我不确定插入物上发生了什么。 我担心对于单个插入,需要计算所有行的唯一键。

您认为最快的解决方案是什么?

postgresql performance constraints
1个回答
0
投票

在第二种情况下,您有小写名称的索引。这意味着小写名称已经被计算并存储在可以快速搜索的数据结构(索引)中。当您插入新名称时,会计算其小写字母,然后在此索引中根据重新计算的先前存在记录的小写名称进行搜索。

在第一种情况下,您只有一个生成的列,不保证唯一性。您可以为其添加唯一约束,这将使其与第二个解决方案非常相似。

© www.soinside.com 2019 - 2024. All rights reserved.