MySQL 约束详解
MySQL 中的约束是用来保证数据的完整性的机制。数据完整性一般有以下三种形式:
- 实体完整性:保证表中有一个主键。
- 域完整性:保证数据每列的值满足特定条件。
- 引用完整性:保证两张表之间的引用关系。
以上三种形式的完整性在 MySQL 中都有相应约束进行保证。
使用主键和唯一键约束可以保证实体完整性;使用外键、合适和数据类型、触发器或者 DEFAULT 关键字也可以保证域完整性;使用外键和触发器可以保证引用完整性。可见 MySQL 提供了以下几种约束:
- Primary Key
- Unique Key
- Foreign Key
- Default
- NOT NULL
- 触发器
Primary key、Unique Key 和 Foreign Key 约束
Primary Key 用于约束唯一主键,唯一标识表中的每一条记录,主键对应的列不允许有 NULL 值和重复值,每个表都应该只有一个主键(包含 Unique 约束)。
Unique Key 用于约束唯一索引,唯一标识表中的每一条记录,与 Primary Key 的区别在于可以有多个列同时被定义为 Unique Key。
Foreign Key 用于保证域和参照的完整性。外键当中出现的值必须在其他表中为主键。同时当父表发生变化时,对子表的操作可以有 4 种方案:CASCADE(删除子表对应的行)、SET NULL(将子表对应行置空)、NO ACTION、RESTRICT。
对错误数据的约束
MySQL 允许非法的或不正确的数据的插入或更新,例如向 NOT NULL 的列中插入一个 NULL 值,那么此时 MySQL 会将 NULL 值更改为 0 值插入。如果想要 MySQL 在用户插入错误数据时进行报错而不是警告,需要设置参数 sql_mode。
ENUM 和 SET 约束
用来约束离散值在一个集合以内。如果是连续值和范围的约束需要通过触发器去实现。
触发器与约束
触发器的作用是在执行 INSERT、DELETE 和 UPDATE 命令之前或之后自动调用 SQL 命令或存储过程。一个表可以建立 6 个触发器,即 3 个操作 AFTER 和 BEFORE 各建一个。