**约束(Constraints)**是数据库在表中的数据上强制执行的规则——在数据库层面保证数据完整性(而不仅仅在应用程序代码中)。主要的约束有:PRIMARY KEY、FOREIGN KEY、UNIQUE、NOT NULL、CHECK 和 DEFAULT。
**约束(Constraints)**是数据库在表中的数据上强制执行的规则——在数据库层面保证数据完整性(而不仅仅在应用程序代码中)。主要的约束有:PRIMARY KEY、FOREIGN KEY、UNIQUE、NOT NULL、CHECK 和 DEFAULT。
CREATE TABLE users (
id INT PRIMARY KEY, -- unique + not null identifier
email VARCHAR(255) UNIQUE NOT NULL, -- must be unique AND present
age INT CHECK (age >= 0 AND age <= 120), -- must satisfy a condition
country VARCHAR(2) DEFAULT 'US', -- default value if not provided
role VARCHAR(20) NOT NULL DEFAULT 'user',
manager_id INT REFERENCES users(id) -- FOREIGN KEY (referential integrity)
);
PRIMARY KEY → uniquely identifies a row (unique + not null, indexed)
FOREIGN KEY → references another table's key (referential integrity)
UNIQUE → no duplicate values allowed in this column
NOT NULL → the column must have a value (can't be NULL)
CHECK → the value must satisfy a condition (age >= 0, status IN (...))
DEFAULT → a value used when none is provided on insert
-- ❌ relying only on application code to enforce uniqueness:
-- a race condition or a bug or a different app could insert a duplicate
-- ✅ a UNIQUE constraint guarantees it at the DB level — ALWAYS enforced,
-- regardless of which code or how many apps access the database
email VARCHAR(255) UNIQUE
数据库约束是数据完整性的最后一道防线——无论什么代码插入数据(多个应用程序、脚本、手动更改或有缺陷的代码),它们都会被强制执行,并且可以处理应用程序级别检查无法捕捉的竞态条件。
CHECK (price > 0) -- prices must be positive
CHECK (status IN ('active', 'inactive')) -- only valid statuses
CHECK (end_date > start_date) -- logical consistency
CHECK 直接在模式中强制业务/域规则。
约束对于维护数据完整性是必不可少的——它们保证数据库中的数据在数据库层面满足规则(唯一性、存在性、有效值、有效引用),这是可靠应用程序的基础,因此理解它们很重要。
了解约束类型(PRIMARY KEY、FOREIGN KEY、UNIQUE、NOT NULL、CHECK、DEFAULT)以及每个约束强制执行的内容对于正确的模式设计是必要的。
最重要的概念是为什么在数据库层面而不是仅在应用程序代码中强制执行:数据库约束是数据完整性的最后一道防线——无论哪个代码或有多少应用程序访问数据,它们都始终被强制执行,它们捕捉应用程序检查可能遗漏的bug,更重要的是它们处理竞态条件,而应用程序级别的验证无法处理(例如两个同时插入都通过应用程序级别的唯一性检查,但 UNIQUE 约束正确地拒绝了重复)。
仅依赖应用程序代码来确保完整性是危险的;约束提供了保证。
理解**CHECK 约束**用于在模式中直接强制域/业务规则(有效范围、允许值、逻辑一致性)也很有价值。
由于数据完整性对可靠应用程序至关重要,由于约束提供了数据库层面的保证,可以防止bug、竞态条件和数据不一致,这些是应用程序代码单独无法做到的,因此理解约束——类型、它们的完整性保证以及数据库层面强制执行的重要性——是设计健壮数据库的重要基础知识,也是构建数据保持一致和有效的应用程序的关键方面。