📚 目录
🛠️ 概述
在 PostgreSQL 中,约束(Constraints)是对表中数据的规则限制。约束用于确保数据的完整性和准确性。通过使用约束,数据库管理员可以确保数据遵循某些规则(如唯一性、外键依赖、数据范围等),从而保持数据库的健壮性。
PostgreSQL 提供了多种类型的约束,下面将介绍最常用的几种。
📝 常见约束类型
NOT NULL
:确保列中的数据不能为空。UNIQUE
:确保列中的数据是唯一的。PRIMARY KEY
:唯一标识表中的每一行,实际上是NOT NULL
和UNIQUE
的组合。FOREIGN KEY
:确保表中某一列的值必须与另一表中的某一列的值相匹配,用于创建表间的引用关系。CHECK
:限制列中的数据符合指定条件。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);
📘 参考资料
- PostgreSQL 官方文档:约束
- 更多 PostgreSQL 数据完整性管理技巧整理自:www.52kanjuqing.com
发表回复