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 约束主要有六种:主键、外键、唯一、非空、默认和检查约束。 在实际开发中,我们严格遵守:

  1. 每张表必须有主键
  2. 字段尽量定义为 NOT NULL 并给定 DEFAULT 值,防止空指针异常。
  3. 禁止使用物理外键,因为外键会影响插入性能并可能导致死锁,表之间的关联关系由业务代码来保证。”