PostgreSQL 唯一约束

2025年3月17日 | 阅读 8 分钟

在本节中,我们将了解 PostgreSQL 唯一约束 的工作原理,它用于确保表中列中的所有值都是唯一的。

PostgreSQL 唯一约束示例,如何在多列上创建唯一约束,使用唯一索引添加唯一 约束,以及如何为特定表删除唯一约束

什么是 PostgreSQL 唯一键约束?

PostgreSQL 中,唯一约束 用于维护我们存储到表的字段或列中的值的独立性。它与一组列约束或列约束和表约束兼容。

当我们使用唯一约束时,会在一个或多个列上自动生成索引。如果在不同行中向列中添加两个不同的空值,则不会中断唯一约束的规范。

有时,如果我们想确保存储在一个或多个列中的值在整个表中是唯一的,那么一列就不能存储重复值

例如

  • 客户的电话号码应该是客户表中的唯一列
  • 学号电子邮件地址应该是学生表中的唯一列

当我们使用唯一约束时,每次插入新行时,它都会检查该值是否已存在于表中,如果该值已存在,则拒绝修改并引发错误。更新当前数据时也将遵循类似的步骤。

为什么我们需要在 PostgreSQL 中使用唯一约束

  • 唯一约束可以将空值包含在表中。
  • 为了避免两条记录将相同的值存储到列中,唯一约束非常有用。
  • 它还可以与外键一起使用以维护表的唯一性。
  • 在 PostgreSQL 中,唯一约束只包含不同的值,这可以保持数据库的可靠性和完整性,以便以有组织的方式检索信息。

唯一约束与主键

唯一约束和 主键 的主要区别如下

唯一约束主键
唯一约束相关的一些字段可以包含空值,如果值的组合是唯一的。与主键相关的任何字段都不能包含空值。

如何在 PostgreSQL 中创建唯一约束

我们可以借助以下命令创建 PostgreSQL 唯一约束

  • CREATE TABLE 命令
  • ALTER TABLE 命令

现在,我们将详细讨论这两个命令。

使用 CREATE TABLE 命令创建唯一约束

在 PostgreSQL 中,我们可以借助 CREATE TABLE 命令 生成唯一约束

创建唯一约束的语法

以下插图用于显示如何使用 CREATE TABLE 命令创建唯一约束

第一个语法用于在表中为一列创建唯一约束

我们可以使用第二个插图在表中为多列创建唯一约束

注意:如果我们不定义唯一约束名称,PostgreSQL 会自动为特定列创建名称。因此,建议在生成表时使用约束名称。

参数说明

在上面的语法中,我们使用了以下参数,我们将在下表中讨论

参数名称描述
Table_name这是我们要创建的表的名称。
column1, column2这些是我们创建的表中的列。
constraint_nameconstraint_name 参数用于指定唯一约束的名称。
Column_name(s)这些是即将成为唯一约束的列。

使用 Create 命令的 PostgreSQL 唯一约束示例

为了理解 PostgreSQL 唯一约束 的工作原理,我们将看下面的示例。

在下面的示例中,我们创建了一个名为 Customers 的新表,其中包含多个列,例如 Customer_ID、Customer_name、Addressemail_ID

email_id 是唯一列,它唯一地标识 Customer 表中的 email id

我们可以使用以下命令创建 Customers

输出

执行上述命令后,我们将收到以下消息窗口,其中显示 Customers 表已成功创建到 jtp 数据库中。

PostgreSQL Unique Constraint

成功创建新表 Customers 后,我们将借助 INSERT 命令向其中输入一些值。

输出

执行上述命令后,我们将收到以下消息窗口,其中显示四个值已成功插入到 Customers 表中。

PostgreSQL Unique Constraint

现在,我们将向 Customers 表中插入另一行,其中包含重复的 email_id,如下所示

输出

执行上述插入命令后,PostgreSQL 发出了以下错误消息

错误:重复的键值违反了唯一约束 "customers_email_id_key" 详细信息:键 (email_id)=([email protected]) 已存在。

PostgreSQL Unique Constraint

在多列上生成唯一约束

让我们看一个示例来了解 PostgreSQL 在多列上唯一约束 的工作原理。

假设我们想在多列上指定主键;在这种情况下,我们可以看到下面的 Create 命令 示例,它帮助我们生成一个名为 Customer_info 的新表。

并且列 Cust_username 和 Cust_email 中的值组合将在整个表中是唯一的。列 Cust_usernameCust_email 的值不需要是唯一的。

输出

执行上述命令后,我们将收到以下消息窗口,其中显示 Customer_info 表已成功创建到 Jtp 数据库中。

PostgreSQL Unique Constraint

使用 ALTER TABLE 命令创建唯一约束并使用唯一索引添加唯一约束

我们可以借助 ALTER TABLE 命令在 PostgreSQL 中生成唯一约束,我们还可以使用 PostgreSQL 唯一索引 添加唯一约束。

创建唯一约束的语法

以下插图用于使用 PostgreSQL 中的 ALTER TABLE 命令 创建唯一约束

在上面的语法中,我们使用了以下参数,我们将在下表中讨论

参数名称描述
Table_name它是我们即将修改的表的名称。
列列表这些是我们在表中创建的列。
constraint_name它用于定义唯一约束名称。

使用 ALTER TABLE 命令的 PostgreSQL 唯一约束示例以及使用唯一索引添加唯一约束

在下面的示例中,我们将了解 PostgreSQL 唯一约束 使用 ALTER TABLE 命令 的工作原理,并遵循以下步骤使用唯一索引添加唯一约束

步骤 1:创建新表

首先,我们将创建一个名为 Student 的新表,该表在表描述中不包含唯一列

输出

执行上述命令后,我们将收到以下消息窗口,其中显示 Student 表已成功创建到 Jtp 数据库中。

PostgreSQL Unique Constraint

步骤2:创建唯一索引

创建 Student 表后,我们将基于 Student_email 列创建新索引。

有关 PostgreSQL 唯一索引的更多信息,请参阅以下链接

postgresql-唯一索引

输出

执行上述命令后,我们将收到以下消息窗口,显示特定索引已成功创建。

PostgreSQL Unique Constraint

步骤3:向指定表添加唯一约束

成功创建 Student_Student_email 索引后,我们将借助 ALTER TABLE 命令向 Student 表添加唯一约束,如下所示

输出

执行上述命令后,我们将收到以下消息窗口: Student 表已成功更改。

PostgreSQL Unique Constraint

在上面的截图中,我们可以看到 PostgreSQL 发出了一条通知,其中说 ALTER TABLE / ADD CONSTRAINT USING INDEX 会将索引 "student_student_email" 重命名为 "unique_student_email"。

注意

  • ALTER TABLE 命令获取表的排他锁。如果存在任何未完成的事务,它将等待所有事务完成,然后才能更改表。
  • 要查看现有的未完成事务,我们应该借助以下命令检查 pg_stat_activity

输出

执行上述命令后,我们将得到以下输出,其中我们可以在事务中找到值为 idle 和 activeState 列。而 idle 状态 定义了这些是未完成的事务

PostgreSQL Unique Constraint

如何删除 PostgreSQL 唯一约束

在 PostgreSQL 中,我们可以借助 ALTER TABLE 命令删除唯一约束。

删除唯一约束的语法

以下插图用于使用 PostgreSQL 中的 ALTER TABLE 命令删除唯一约束

在上面的语法中,我们使用了以下参数,我们将在下表中讨论

参数描述
table_name表名参数用于指定需要修改的表的名称。
constraint_name约束名称参数用于定义我们想要删除的唯一约束名称。

使用 ALTER TABLE 命令删除 PostgreSQL 唯一约束的示例

让我们看一个从特定表中删除唯一约束的示例。

为此,我们以 Customer_info 表为例,借助 ALTER TABLE 命令删除唯一约束,如下所示

输出

成功执行上述命令后,我们将收到以下消息窗口,显示唯一约束 (uc_Cust_username_Cust_email) 已从 Customer_info 表中删除。

PostgreSQL Unique Constraint

概述

PostgreSQL 唯一约束 部分中,我们学习了以下主题

  • 我们使用了 CREATE TABLE 命令为特定表创建唯一约束
  • 我们理解了使用 CREATE TABLE 更改 PostgreSQL 唯一约束的概念
  • 我们使用 PostgreSQL 唯一索引 向现有表添加了唯一约束。
  • 我们使用了 ALTER TABLE 命令从特定表中删除唯一约束