PostgreSQL 约束

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

约束用于描述表中数据列的规则。如果约束与数据操作之间有任何冲突,则操作将立即终止。约束确保数据库中数据的可靠性和正确性。

在本节中,我们将讨论所有 PostgreSQL 约束

约束可以进一步划分为列级或表级,其中表级约束用于整个表,而列级约束仅用于一列

在哪里使用约束?

约束最常用于以下领域

  • 创建后,可以将其添加到表中,也可以暂时禁用它。
  • 对于单个列,我们可以使用列约束。
  • 当使用 CREATE TABLE 命令创建表时,我们还可以声明约束。
  • SQL 可以丢弃任何破坏明确定义标准的值。
  • 与约束相关的所有信息都保存在数据字典中。
  • 对于一个或多个列,我们可以使用表约束。
  • 所有约束都分配有一个名称。

PostgreSQL 约束类型

让我们来看一下 PostgreSQL 中最常用的约束。

PostgreSQL Constraints
约束描述
Not Null这种类型的约束用于确保列不能包含 NULL 值。并且不能再定义名称来生成非空约束。
Check它用于确保表中的列或字段中的所有值都满足特定条件,例如必须匹配布尔表达式。 CHECK 约束可以由单独的名称定义。
UniqueUNIQUE 约束用于确保表中的列中的所有值都是唯一的。
主键PRIMARY KEY 用于唯一地标识数据库表中的每一行或记录,并确保表中没有记录重复。
外键在 PostgreSQL 中,FOREIGN KEY 用于定义表中列或字段中的值等于另一个表的主键的实际值。
排除此约束用于确保两个行通过定义的运算符链接在精确的列或语句上,并且其中一个运算符评估应返回 NULL 或 FALSE

NOT NULL 约束

在 NOT NULL 约束中,列默认可以包含 NULL 值。如果我们不希望某一列有 NULL 值,那么我们需要在此列状态上解释此类约束,即该特定列现在不允许 NULL。它始终创建为 列约束,它表示未知数据,但并不意味着数据将为 NULL。

例如

在下面的情况下,我们正在创建一个名为 Customer 的新表,该表有五个列,分别是 Cust_Id、Cust_Name、Cust_Address、Cust_Age 和 Cust_Salary

PgAdmin4 中的 SQL 查询

在下面的屏幕截图中,我们可以在 pgAdmin4 中看到上述查询。

PostgreSQL Constraints

说明

上面的示例显示已创建 Customer 表,其中 Cust_Id、Cust_Name 和 Cust_Age 列被指定为不接受 NULL 值。

表结构

执行 SELECT 命令后,我们可以看到 Customer 表的表结构。

PostgreSQL Constraints

CHECK 约束

在 PostgreSQL 中,CHECK 约束可以由单独的名称定义。它用于控制插入的列的值。它允许我们验证将值存储到记录中的条件。如果语句为 false,则数据会破坏约束,并且不会保存到表中。

例如

在下面的示例中,我们正在创建一个名为 Customer2 的新表,该表包含 五个列

PgAdmin4 中的 SQL 查询

PostgreSQL Constraints

说明

在上面的示例中,我们在 Customer2 表的 Cust_SALARY 列中添加了一个 CHECK,其中 Cust_Salary 列不能包含小于或等于 零 (0) 的任何值。

表结构

执行 SELECT 命令后,我们可以看到 Customer2 表的表结构。

PostgreSQL Constraints

唯一约束

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

当我们使用 UNIQUE 约束时,会在一个或多个列上自动生成索引。如果我们向不同行的同一列中添加两个不同的 NULL 值,但这不会破坏 UNIQUE 约束的规范。

例如

在下面的示例中,我们正在创建一个名为 Customer3 的新表,该表具有与上面表相同的五个列。

PgAdmin4 中的 SQL 查询

PostgreSQL Constraints

说明

上面的示例中,Cust_Age 列设置为 UNIQUE; 因此,我们可以避免两个人拥有相同年龄的重复。

表结构

执行 SELECT 命令后,我们可以看到 Customer3 表的表结构。

PostgreSQL Constraints

主键约束

它是表中的一个字段,可以唯一地标识数据库表中的每一行或记录,并且它包含一个唯一值。主键不包含任何 NULL 值。因此,我们也可以说 主键 是表中的 UNIQUENOT NULL 约束的集合。

它用于独特地标识数据库表中的每个记录。在这里,我们可以包含其他唯一列,但数据库表中只有一个主键,它包含单个或多个字段。它是创建数据库表时最重要的键,它可能是一个唯一 ID。它可以指定为一列或一组列。

主键的工作方式与 UNIQUE 约束类似。但是,它们之间最重要的区别是,一个表只能有一个 主键;但是,一个表可以有一个或多个 UNIQUENOT NULL 约束。

示例

在下面的示例中,我们正在创建一个名为 Employee 的新表,该表包含 四列,分别是 Emp_Id、Emp_Name、Emp_Address 和 Emp_Age

PgAdmin4 中的 SQL 查询

PostgreSQL Constraints

说明

上面的示例中,已创建 Employee 表,其中 Emp_Id 列作为 主键,它唯一地表示 员工 ID

表结构

执行 SELECT 命令后,我们可以看到 Employee 表的表结构。

PostgreSQL Constraints

外键约束

它是一组列,其值依赖于另一个表的主键的好处。它用于使列或列组合中的值必须显示在另一个表中的相同列或列组合中。

在 PostgreSQL 中,外键的值与另一个表中的主键的实际值并行;因此,它也被称为 参照完整性约束

例如

在下面的示例中,我们正在创建一个名为 Employee1 的新表,该表包含与上一个表类似的四列。

在这个特定的示例中,我们将创建另一个名为 cust 的表,该表包含三列。在这里,我们将 Cust_Id 列创建为 外键,它引用 Employee1 表的 Emp_ID 字段。

PgAdmin4 中的 SQL 查询

PostgreSQL Constraints

表结构

在这里,我们可以看到 Cust 表的表结构,它引用 Employee1 表。

PostgreSQL Constraints

EXCLUSION 约束

它用于确保两个行使用定义的运算符链接在指定的列或语句上。在任何情况下,其中一个运算符的求值都将返回 NULL 或 FALSE。

例如

在下面的示例中,我们正在创建一个名为 Employee 的新表,该表包含五列。在这里,我们还将使用 EXCLUDE 约束。

现在,对于 EXCLUSION 约束,我们将使用 USING GIST,它是用于创建和实现的索引。

注意:如果我们使用排除约束,我们必须运行 CREATE EXTENSION

btree_gist 命令,在一个数据库中运行一次。之后,它将连接 btree_gist 扩展,该扩展定义了基本标量数据类型的约束。

现在,我们将向 Employee3 表插入一些记录,并且我们也强制执行了相同的年龄。

前两个 INSERT 命令将成功执行。

记录已添加到 Employee3 表中,如下面的屏幕截图所示。

PostgreSQL Constraints

但是对于 第三个 INSERT 命令,我们可能会遇到以下错误:

PostgreSQL Constraints

PgAdmin4 中的 SQL 查询

PostgreSQL Constraints

删除约束

如果我们要删除一个约束,那么我们应该记住该约束的名称,因为这样更容易直接按名称删除该约束。否则,我们将需要识别系统生成的名称。

psql 中,可以使用以下命令查找名称。

删除约束的语法如下:


下一个主题PostgreSQL 主键