我想在大表上有一个不区分大小写的唯一键。
我正在寻找最快的方法。
我找到了两个选项:
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));
但我不确定插入物上发生了什么。 我担心对于单个插入,需要计算所有行的唯一键。
您认为最快的解决方案是什么?
在第二种情况下,您有小写名称的索引。这意味着小写名称已经被计算并存储在可以快速搜索的数据结构(索引)中。当您插入新名称时,会计算其小写字母,然后在此索引中根据重新计算的先前存在记录的小写名称进行搜索。
在第一种情况下,您只有一个生成的列,不保证唯一性。您可以为其添加唯一约束,这将使其与第二个解决方案非常相似。