在 PostgreSQL 中创建表后添加唯一约束
今天,我们将学习如何在表中的行已经创建后添加 UNIQUE
约束。
UNIQUE 约束保证一行中的数据在该列中是唯一的。因此,如果存在列 ID,则所有行都将具有唯一值,而不是重复值。
但是,即使有约束,也可能出现两行以上的空值。
但是如果我们忘记在我们想要的列中添加 UNIQUE
怎么办?今天,我们将看看如何在创建表后向所需列添加唯一约束。
在 PostgreSQL 中创建表后使用 alter
语句添加唯一约束
alter
语句支持包含 UNIQUE
。在我们的示例中,我们将使用一个名为 Dog
的已经制作好的表格。
这个表有一个 tag
作为主键和一个 owner_id
。owner_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_test
的 UNIQUE
约束被违反了。
但是如果我们已经在表中有重复的值并添加了 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
添加到列中,这意味着所有值都必须是唯一的。
如果你已经有重复的值,则不能期望该列是唯一的;因此,这是被舍弃的。
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