MySQL 表约束详解
一、为什么要有表的约束?
在 MySQL 中,数据类型本身会对数据形成一定的约束。如果插入的数据不符合当前数据类型的范围或规则,MySQL 会进行拦截。
通过约束,可以保证未来插入数据库表中的数据是符合预期的。约束的本质是通过技术手段,倒逼程序员插入正确的数据。凡是插入进来的数据,都应符合数据约束。
二、表的约束
单单只通过数据类型来进行约束是不够的,还需要有更多的约束条件。
2.1 空属性
一般有两个值:NULL(默认)和 NOT NULL(不为空)。
使用 DESC 指令查看表的属性时,Null 这一列默认为 YES,表示该属性可以为空。
设置 NOT NULL:
在创建表时,在属性后面加上 NOT NULL 即可将该属性设置为不为空。再次查看表属性时,Null 列将显示为 NO。
验证:尝试插入 NULL 值时,MySQL 会拦截并报错,提示该列不能为空。
2.2 默认值
默认值用于指定当未传入参数时使用的具体值。类似于 C++ 中的缺省值。
在 DESC 结果中,Default 列显示默认值。若未设置,则为 NULL。
设置默认值:
在属性后面加上 DEFAULT + 默认值。
NOT NULL 与 DEFAULT 的关系: 两者不冲突,反而互补。
NOT NULL:要求插入的数据不能为空。DEFAULT:如果不插入数据,则使用默认值。
写法示例:NOT NULL DEFAULT 123456。如果要插入数据,则不能为空;如果不插入数据,则使用默认值。
2.3 列描述
列描述使用 COMMENT,专门用来描述字段含义,供程序员或 DBA 了解。
查看方式:
DESC 指令看不到 COMMENT 内容,需使用 SHOW CREATE TABLE 指令查看建表语句。
列描述不会像 NOT NULL 那样拦截数据,仅作为元数据存在。
2.4 ZEROFILL
ZEROFILL 关键字用于控制整数类型的显示宽度。
效果:
如果插入的数据宽度小于定义宽度,会在前面自动补 0。例如 INT(10) 插入 123,显示为 0000000123。
注意: 实际存储的值不变,仅是显示效果。如果插入数据宽度超过定义宽度,则不再补 0。
宽度说明:
INT 类型括号中的数字通常默认为 10,对应 INT 的范围宽度(约 21 亿)。
- 无符号 (
UNSIGNED):宽度为 10。 - 有符号:宽度为 11(多一个符号位)。
2.5 主键
主键 (PRIMARY KEY) 唯一约束字段数据,不能重复,不能为空。一张表中最多只能有一个主键。
设置主键:
在属性后加 PRIMARY KEY。
修改主键:


