PostgreSQL 通过 约束(constraints) 来强制数据完整性 — 这些是对表数据的规则。除了标准约束(PRIMARY KEY、、、、、)之外,Postgres 还添加了强大的选项,如 约束和灵活的 表达式。
PostgreSQL 通过 约束(constraints) 来强制数据完整性 — 这些是对表数据的规则。除了标准约束(PRIMARY KEY、、、、、)之外,Postgres 还添加了强大的选项,如 约束和灵活的 表达式。
FOREIGN KEYUNIQUENOT NULLCHECKDEFAULTCHECKCREATE TABLE bookings (
id SERIAL PRIMARY KEY, -- unique identifier
room_id INT NOT NULL REFERENCES rooms(id), -- foreign key (referential integrity)
email VARCHAR(255) UNIQUE NOT NULL, -- unique + required
guests INT CHECK (guests > 0 AND guests <= 10), -- value constraint
status TEXT DEFAULT 'pending' -- default value
);
PRIMARY KEY → unique row identifier
FOREIGN KEY → references another table (referential integrity, with ON DELETE options)
UNIQUE → no duplicate values
NOT NULL → must have a value
CHECK → value must satisfy a condition
DEFAULT → default value when not provided
CHECK (price > 0)
CHECK (end_date > start_date) -- logical consistency between columns
CHECK (status IN ('active', 'inactive', 'pending'))
CHECK (email ~ '^[^@]+@[^@]+\.[^@]+$') -- regex validation
Postgres CHECK 约束可以强制执行丰富的业务规则,包括跨列条件和正则表达式模式。
-- prevent OVERLAPPING bookings for the same room (impossible with UNIQUE alone!)
CREATE TABLE bookings (
room_id INT,
during TSRANGE, -- a time range
EXCLUDE USING GIST (room_id WITH =, during WITH &&) -- no two rows where room_id is
); -- equal AND time ranges OVERLAP
EXCLUDE 约束(一个 Postgres 特有的功能)通过自定义操作符防止冲突的行 — 最著名的是防止 重叠时间范围(重复预订),这是 UNIQUE 约束无法做到的。
-- check constraints at COMMIT instead of immediately (useful for circular references)
FOREIGN KEY (...) REFERENCES ... DEFERRABLE INITIALLY DEFERRED
约束对 数据完整性 至关重要 — 它们在数据库级别强制执行数据规则(最后的防线,始终强制执行,不受应用程序代码影响),因此理解 PostgreSQL 的约束支持对设计健壮的数据库很重要。
了解标准约束(PRIMARY KEY、带有引用完整性的 FOREIGN KEY、UNIQUE、NOT NULL、CHECK、DEFAULT)以及每个约束强制执行的内容,对于架构设计是基础性的,提供数据库级别的保证(唯一性、有效引用、必需值、有效数据),这些保证可以防止应用程序代码单独无法防止的 bug、竞态条件和数据不一致。
Postgres 的 CHECK 约束特别强大,可以强制执行丰富的业务规则,包括跨列条件(逻辑一致性,如 end_date > start_date)甚至正则表达式模式 — 让你直接在架构中编码域规则。
特别有价值的是 Postgres 特有的 EXCLUDE 约束,它通过自定义操作符防止冲突的行 — 最著名的是 防止重叠时间范围(房间/资源的重复预订),这是标准 UNIQUE 约束 无法 提供的强大功能,它可以优雅地在数据库级别解决常见的现实问题(日程安排、预订)。
理解约束 — 用于完整性的标准约束、Postgres 的灵活 CHECK 表达式以及用于冲突防止的强大 EXCLUDE — 对于设计自动强制执行正确性的数据库很重要。
由于数据完整性至关重要,约束提供了应用程序代码无法保证的保障,而且由于 Postgres 提供了强大的选项(丰富的 CHECK、用于重叠的 EXCLUDE)超越基础功能,理解 PostgreSQL 的约束支持是构建健壮数据库的有价值的、实际相关的知识,特别是 EXCLUDE 约束是一个独特的、有用的 Postgres 功能,值得为日程安排/预订系统了解。
一个包含详细解答的 IT 面试题库——从初级到高级。
捐赠