在 PostgreSQL 中创建表后添加唯一约束

Bilal Shahid 2024年2月15日
在 PostgreSQL 中创建表后添加唯一约束

今天,我们将学习如何在表中的行已经创建后添加 UNIQUE 约束。

UNIQUE 约束保证一行中的数据在该列中是唯一的。因此,如果存在列 ID,则所有行都将具有唯一值,而不是重复值。

但是,即使有约束,也可能出现两行以上的空值。

但是如果我们忘记在我们想要的列中添加 UNIQUE 怎么办?今天,我们将看看如何在创建表后向所需列添加唯一约束。

在 PostgreSQL 中创建表后使用 alter 语句添加唯一约束

alter 语句支持包含 UNIQUE。在我们的示例中,我们将使用一个名为 Dog 的已经制作好的表格。

已经做好的表 - 狗

这个表有一个 tag 作为主键和一个 owner_idowner_id 未设置为 UNIQUE,因为如果我们插入以下内容,它将完美地工作。

insert into dog values (14, 2);

输出:

狗表更新

但是现在,让我们将 UNIQUE 约束添加到列 owner_id,看看当我们调用 insert 时会发生什么。

alter table dog add constraint uniq_test UNIQUE (owner_id);

现在,当我们为数据中的重复 owner_id 调用 insert 时; (14, 2),这是 PostgreSQL 将返回的错误。

ERROR:  duplicate key value violates unique constraint "uniq_test"
DETAIL:  Key (owner_id)=(2) already exists.

我们定义为 uniq_testUNIQUE 约束被违反了。

但是如果我们已经在表中有重复的值并添加了 UNIQUE 约束怎么办?在这种情况下,ALTER 将失败并出现以下错误:

ERROR:  could not create unique index "uniq_test"
DETAIL:  Key (owner_id)=(2) is duplicated.

约束添加失败,因为已经存在重复的键。那么我们如何解决这个问题呢?

如果你已经有一个大表并且无法删除重复值,则无法添加约束,即使你使用较旧的查询,例如以下查询:

create unique index uniq_test on dog (owner_id);

它将返回一个 DUPLICATE 错误。

PostgreSQL 这样做是因为如果你将 UNIQUE 添加到列中,这意味着所有值都必须是唯一的。

如果你已经有重复的值,则不能期望该列是唯一的;因此,这是被舍弃的。

作者: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub