1. 核心概念
SQL 约束(Constraints)是规定表中的数据规则。如果存在违反约束的数据行为,行为会被约束终止。约束的主要目的是为了保证数据的完整性(Integrity)和可靠性。
2. 常见约束类型
在标准 SQL 及 MySQL 中,主要有以下 6 种约束:
2.1 主键约束 (PRIMARY KEY)
- 定义:唯一标识数据库表中的每条记录。
- 特点:
- 主键必须包含唯一的值。
- 主键列不能包含 NULL 值。
- 每个表都应该有一个主键,且只能有一个主键。
- 示例:
id INT PRIMARY KEY AUTO_INCREMENT
2.2 外键约束 (FOREIGN KEY)
- 定义:一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。
- 作用:维持两个表之间的数据一致性(参照完整性)。
- 注意:在互联网大厂规范中,通常禁止使用物理外键,而是在应用层(Java 代码)通过逻辑来保证关联关系,以避免死锁和性能问题。
2.3 唯一约束 (UNIQUE)
- 定义:保证某列的每行数据都是唯一的。
- 区别:PRIMARY KEY 自动拥有 UNIQUE 约束,但每个表只能有一个 PK,而可以有多个 UNIQUE 约束。UNIQUE 允许 NULL 值(但在 MySQL 中允许多个 NULL,具体视引擎而定)。
2.4 非空约束 (NOT NULL)
- 定义:指示某列不能存储 NULL 值。
- 作用:强制字段必须有值。
2.5 默认约束 (DEFAULT)
- 定义:当插入记录时,如果没有给该列赋值,则使用默认值。
- 示例:
status TINYINT DEFAULT 0
2.6 检查约束 (CHECK)
- 定义:限制列中的值的范围。
- 示例:
CHECK (age >= 18) - 注意:MySQL 8.0.16 之前版本会忽略 CHECK 子句,8.0.16 之后才正式支持。
3. 总结与最佳实践
| 约束 | 关键字 | 作用 | 互联网开发建议 |
|---|---|---|---|
| 主键 | PRIMARY KEY | 唯一标识 | 必须有,推荐自增 Long 或雪花算法 ID |
| 外键 | FOREIGN KEY | 关联表 | 禁止使用,逻辑在代码层维护 |
| 唯一 | UNIQUE | 保证唯一 | 业务需要时使用,需注意索引开销 |
| 非空 | NOT NULL | 拒绝空值 | 推荐,避免 NullPointer 问题 |
| 默认 | DEFAULT | 默认值 | 推荐,如创建时间、状态值 |
| 检查 | CHECK | 校验逻辑 | 少用,逻辑通常在代码层校验 |
面试回答示例: “SQL 约束主要有六种:主键、外键、唯一、非空、默认和检查约束。 在实际开发中,我们严格遵守:
- 每张表必须有主键。
- 字段尽量定义为 NOT NULL 并给定 DEFAULT 值,防止空指针异常。
- 禁止使用物理外键,因为外键会影响插入性能并可能导致死锁,表之间的关联关系由业务代码来保证。”