环境
DBMS:MySQL 8.0.17
工具:Navicat Premium 11.2.16
概述
约束是指对当前字段的数据的限制条件。常见的约束有:非空约束、default约束、唯一约束、check约束、主键约束和外键约束。
非空约束
定义了非空约束的字段的数据不能取空值。
default约束
定义了default约束的字段的数据没有被赋值或被赋予空值时会取默认值。
唯一约束
若唯一约束只有一个字段,则该字段的值必须唯一。
若唯一约束包含多个字段,则所有字段值的组合必须唯一。
check约束
定义了check约束的字段的数据取值必须满足check约束中定义的条件。
主键约束
定义了主键约束的一个或多个字段组合成一个主键。
一个基本表中最多只能有一个主键。
主键的值必须唯一且不能取空值。也就是说:
- 若主键只有一个字段,则该字段的值必须唯一且不能取空值。
- 若主键包含多个字段,则每个字段的值不能取空值,所有字段值的组合必须唯一。
外键约束
定义了外键约束的字段成为外键。
外键必须关联一个字段,而且该字段必须具有唯一约束或主键约束,而外键的数据类型必须与该字段的数据类型相同。
外键的取值要么为空值,要么为关联字段中的一个值。
定义约束
约束的定义有两种方式:
列级约束是在对列进行定义时添加约束。列级约束无法定义多个字段的约束。
表级约束是在对表进行定义时为表中的字段添加约束。表级约束无法定义非空约束、default约束和check约束。
MySQL中check约束不起作用,而且外键约束只有通过表级约束定义才能生效。
所以,通常情况下:
- 非空约束、default约束使用列级约束定义。
- 外键约束使用表级约束定义。
FOREIGN KEY(<列名>) REFERENCES <表名>(<列名>);
- 定义单个字段的唯一约束或主键约束使用列级约束定义。
- 定义多个字段组合的唯一约束或主键约束使用表级约束定义。
UNIQUE | PRIMARY KEY(<列1>,<列2>,...)
创建基本表class,包含字段clno(主键)、clname(非空、唯一):
创建基本表student,其中包含字段sno(主键、自增)、sname(非空、唯一)、sage、ssex(默认值为“男”)、shobby、clno(关联class表的clno):