在 Postgres 中使用约束

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 【8月更文挑战第11天】

在 PostgreSQL 中,约束(Constraints)是数据库完整性的重要组成部分。约束用于限制表中的数据,以确保数据的准确性、完整性和一致性。PostgreSQL 提供了多种类型的约束,涵盖了各种数据验证和约束需求。本文将详细介绍在 PostgreSQL 中使用约束的不同类型及其实际应用。

1. 什么是约束?

约束是对表中的数据施加的一种规则,用来限制插入、更新或删除操作的合法性。通过使用约束,数据库可以自动检查和维持数据的一致性,防止无效或不符合业务逻辑的数据进入数据库。约束在数据库设计中起着至关重要的作用,有助于维护数据的完整性和可靠性。

2. PostgreSQL 中的约束类型

PostgreSQL 提供了多种约束类型,每种类型都有其特定的用途和应用场景。常见的约束类型包括:

  • NOT NULL 约束
  • UNIQUE 约束
  • PRIMARY KEY 约束
  • FOREIGN KEY 约束
  • CHECK 约束
  • EXCLUSION 约束

2.1 NOT NULL 约束

NOT NULL 约束用于确保某个列不能包含空值(NULL)。当某个列被定义为 NOT NULL 时,任何插入或更新操作都必须为该列提供一个非空值。

示例:

CREATE TABLE employees (
    employee_id SERIAL PRIMARY KEY,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    hire_date DATE NOT NULL
);

在这个示例中,first_namelast_namehire_date 列被定义为 NOT NULL,这意味着在插入新员工记录时,这些列必须提供值。

2.2 UNIQUE 约束

UNIQUE 约束用于确保某个列或列组合中的所有值都是唯一的。UNIQUE 约束可以应用于一个或多个列,以防止插入重复数据。

示例:

CREATE TABLE users (
    user_id SERIAL PRIMARY KEY,
    username VARCHAR(50) UNIQUE,
    email VARCHAR(100) UNIQUE
);

在这个示例中,usernameemail 列被定义为唯一的,这确保了没有两个用户可以使用相同的用户名或电子邮件地址。

2.3 PRIMARY KEY 约束

PRIMARY KEY 约束是 NOT NULLUNIQUE 的组合。它用于唯一标识表中的每一行。一个表只能有一个主键,可以由一个或多个列组成。

示例:

CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    order_date DATE NOT NULL,
    customer_id INT NOT NULL
);

在此示例中,order_id 是主键,它确保每个订单都有一个唯一标识符,并且不允许为空。

2.4 FOREIGN KEY 约束

FOREIGN KEY 约束用于建立表与表之间的关系。它确保表中的某个列的值必须存在于另一个表的主键或唯一键列中,从而维持参照完整性。

示例:

CREATE TABLE customers (
    customer_id SERIAL PRIMARY KEY,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL
);

CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    order_date DATE NOT NULL,
    customer_id INT NOT NULL,
    FOREIGN KEY (customer_id) REFERENCES customers (customer_id)
);

在此示例中,orders 表中的 customer_id 列是一个外键,它引用了 customers 表中的 customer_id 列。这样可以确保每个订单都关联到一个有效的客户。

2.5 CHECK 约束

CHECK 约束用于定义一个布尔表达式,该表达式必须为真才能插入或更新数据。它通常用于验证列中的值是否符合特定条件。

示例:

CREATE TABLE products (
    product_id SERIAL PRIMARY KEY,
    product_name VARCHAR(100) NOT NULL,
    price NUMERIC CHECK (price > 0)
);

在此示例中,price 列的值必须大于零,否则插入或更新操作将失败。

2.6 EXCLUSION 约束

EXCLUSION 约束是 PostgreSQL 特有的一种约束类型,用于确保某些列的值组合在一个范围内不重叠。它常用于确保时间段、几何区域等数据不重叠。

示例:

CREATE TABLE room_reservations (
    room_id INT NOT NULL,
    reservation_time TSRANGE NOT NULL,
    EXCLUDE USING GIST (
        room_id WITH =,
        reservation_time WITH &&
    )
);

在这个例子中,EXCLUSION 约束确保了相同的房间在相同的时间段内不会有重叠的预订。

3. 使用约束的注意事项

在使用约束时,有几个重要的注意事项:

  • 性能考虑:约束会增加数据验证的开销,特别是在插入和更新大量数据时。因此,在设计表时,应合理选择和使用约束。
  • 约束的命名:为每个约束指定明确的名称有助于在出现错误时更容易识别和调试。
  • 组合约束:在某些情况下,可以组合使用多个约束来实现更复杂的数据验证。例如,可以将 CHECK 约束与 FOREIGN KEY 约束结合使用。

结论

在 PostgreSQL 中,约束是保证数据完整性和一致性的重要工具。通过合理使用 NOT NULLUNIQUEPRIMARY KEYFOREIGN KEYCHECKEXCLUSION 等约束,可以确保数据库中的数据始终符合业务规则和逻辑要求。在数据库设计和开发过程中,掌握和应用这些约束,有助于创建更可靠、更健壮的数据库系统。

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
6月前
|
存储 关系型数据库 MySQL
【MySQL】6. 表的约束
【MySQL】6. 表的约束
35 0
|
5月前
|
关系型数据库 MySQL
MYSQL:约束(主键约束)
MYSQL:约束(主键约束)
|
3月前
|
SQL 存储 关系型数据库
在 Postgres 中使用派生表
【8月更文挑战第11天】
48 0
在 Postgres 中使用派生表
|
4月前
|
SQL Oracle 关系型数据库
ALTER TABLE 时的 SQL PRIMARY KEY 约束
【7月更文挑战第24天】ALTER TABLE 时的 SQL PRIMARY KEY 约束。
40 3
|
4月前
|
SQL Oracle 关系型数据库
SQL UNIQUE 约束
【7月更文挑战第19天】SQL UNIQUE 约束。
42 4
|
4月前
|
SQL Oracle 关系型数据库
ALTER TABLE 时的 SQL UNIQUE 约束
【7月更文挑战第16天】ALTER TABLE 时的 SQL UNIQUE 约束。
25 1
|
5月前
|
SQL Oracle 关系型数据库
SQL FOREIGN KEY 约束
SQL FOREIGN KEY 约束
28 2
|
5月前
|
SQL 存储
SQL 约束(Constraints)
SQL 约束(Constraints)
35 1
|
5月前
|
存储 关系型数据库 MySQL
【MySQL】表的约束
【MySQL】表的约束
|
6月前
|
存储 关系型数据库 MySQL
【MySQL】表的约束 -- 详解
【MySQL】表的约束 -- 详解