在 PostgreSQL 中,约束(Constraints)是用于限制进入数据库表中数据的规则。它们确保数据的准确性和可靠性,通过定义规则来防止无效数据的插入或更新。PostgreSQL 支持多种类型的约束,每种约束都有特定的用途和语法。以下是主要的约束类型及其简要说明:
-
PRIMARY KEY(主键约束):
- 确保表中每一行的唯一标识。
- 主键列的值必须唯一且不能为空(NOT NULL)。
- 一个表只能有一个主键,但主键可以包含多个列(复合主键)。
CREATE TABLE students ( student_id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL );
-
FOREIGN KEY(外键约束):
- 确保在一个表中的值在另一个表的主键或唯一键中存在。
- 用于维护表之间的参照完整性。
CREATE TABLE enrollments ( enrollment_id SERIAL PRIMARY KEY, student_id INT, course_id INT, FOREIGN KEY (student_id) REFERENCES students(student_id), FOREIGN KEY (course_id) REFERENCES courses(course_id) );
-
UNIQUE(唯一约束):
- 确保列中的所有值都是唯一的。
- 允许空值(NULL),但多个空值不违反唯一性。
CREATE TABLE students ( student_id SERIAL PRIMARY KEY, email VARCHAR(100) UNIQUE );
-
CHECK(检查约束):
- 确保列中的值满足指定的条件。
- 可以在列级别或表级别定义。
CREATE TABLE students ( student_id SERIAL PRIMARY KEY, age INT CHECK (age >= 0 AND age <= 120) );
-
NOT NULL(非空约束):
- 确保列中的值不能为空。
- 可以在列定义时直接指定。
CREATE TABLE students ( student_id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL );
-
EXCLUDE(排除约束):
- 确保使用指定的运算符(如等于、不等于、小于、大于等)的列组合中的值不会冲突。
- 通常用于确保地理数据(如经纬度)不会重叠。
CREATE TABLE circles ( circle_id SERIAL PRIMARY KEY, center POINT, radius DOUBLE PRECISION, EXCLUDE USING GIST (circle_with_radius WITH =, circle_with_center WITH &&) ) WHERE (radius > 0);
在上面的例子中,
circle_with_radius
和circle_with_center
是使用表达式索引定义的虚拟列,用于确保没有两个圆重叠。 -
DEFAULT(默认值约束):
- 为列指定默认值,当插入数据时没有为该列提供值时,将使用默认值。
CREATE TABLE students ( student_id SERIAL PRIMARY KEY, enrollment_date DATE DEFAULT CURRENT_DATE );
通过合理地使用这些约束,可以确保数据库中的数据保持一致性、准确性和完整性。在定义表结构时,应该根据业务需求选择适当的约束来限制数据输入。