📚 目录

  1. 概述
  2. 常见约束类型
  3. 约束的基本语法
  4. 约束的应用
  5. 删除和修改约束
  6. 参考资料

🛠️ 概述

在 PostgreSQL 中,约束(Constraints)是对表中数据的规则限制。约束用于确保数据的完整性和准确性。通过使用约束,数据库管理员可以确保数据遵循某些规则(如唯一性、外键依赖、数据范围等),从而保持数据库的健壮性。

PostgreSQL 提供了多种类型的约束,下面将介绍最常用的几种。


📝 常见约束类型

  1. NOT NULL:确保列中的数据不能为空。
  2. UNIQUE:确保列中的数据是唯一的。
  3. PRIMARY KEY:唯一标识表中的每一行,实际上是 NOT NULLUNIQUE 的组合。
  4. FOREIGN KEY:确保表中某一列的值必须与另一表中的某一列的值相匹配,用于创建表间的引用关系。
  5. CHECK:限制列中的数据符合指定条件。
  6. EXCLUSION:确保没有两行在指定列的值上产生冲突(多用于范围数据类型)。

🔢 约束的基本语法

在创建表时,可以通过 CONSTRAINT 子句来定义约束。约束可以直接定义在列级别,也可以在表级别定义。

示例(列级约束):

CREATE TABLE employees (
    employee_id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    salary DECIMAL CHECK (salary > 0),
    department_id INT,
    CONSTRAINT fk_department FOREIGN KEY (department_id) REFERENCES departments (department_id)
);

在此示例中,定义了四种常见约束:

  • PRIMARY KEY:确保 employee_id 的唯一性。
  • NOT NULL:确保 name 列不能为 NULL
  • CHECK:确保 salary 列的值大于 0。
  • FOREIGN KEY:确保 department_id 列的值必须与 departments 表中的 department_id 对应。

示例(表级约束):

CREATE TABLE employees (
    employee_id SERIAL,
    name VARCHAR(100),
    salary DECIMAL,
    department_id INT,
    CONSTRAINT pk_employee PRIMARY KEY (employee_id),
    CONSTRAINT fk_department FOREIGN KEY (department_id) REFERENCES departments (department_id),
    CONSTRAINT chk_salary CHECK (salary > 0)
);

此查询与上面类似,但约束是通过 CONSTRAINT 子句在表级别定义的。


🔢 约束的应用

  • NOT NULL:确保某列不接受 NULL 值。通常用于标识列和重要信息列。 示例: CREATE TABLE products ( product_id SERIAL PRIMARY KEY, product_name VARCHAR(100) NOT NULL );
  • UNIQUE:确保某列中的每个值都是唯一的。这通常用于例如用户名、电子邮件地址等字段。 示例: CREATE TABLE users ( user_id SERIAL PRIMARY KEY, email VARCHAR(255) UNIQUE );
  • PRIMARY KEY:唯一标识表中的每一行,不能为 NULL。 示例: CREATE TABLE customers ( customer_id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL );
  • FOREIGN KEY:用于建立表之间的关联,确保在主表中存在对应的值。 示例: CREATE TABLE orders ( order_id SERIAL PRIMARY KEY, customer_id INT, CONSTRAINT fk_customer FOREIGN KEY (customer_id) REFERENCES customers (customer_id) );
  • CHECK:确保数据符合某个特定的条件。 示例: CREATE TABLE products ( product_id SERIAL PRIMARY KEY, price DECIMAL CHECK (price > 0) );

🔄 删除和修改约束

你可以在表创建之后删除或修改约束。要删除约束,可以使用 ALTER TABLE 语句。

删除约束:

ALTER TABLE table_name DROP CONSTRAINT constraint_name;

修改约束:

如果需要修改约束,通常需要先删除原有约束,再添加新的约束。

ALTER TABLE table_name DROP CONSTRAINT constraint_name;
ALTER TABLE table_name ADD CONSTRAINT constraint_name CHECK (new_condition);


📘 参考资料