💬 :如果你在阅读过程中有任何疑问或想要进一步探讨的内容,欢迎在评论区畅所欲言!我们一起学习、共同成长~!
👍 :如果你觉得这篇文章还不错,不妨顺手点个赞、加入收藏,并分享给更多的朋友噢~!
1. 空属性(null/not null)
1.1 核心作用
控制字段是否允许存储 “空值”(空值表示无数据):
null:默认值,字段可空(不赋值也能插入);not null:字段必须赋值,不能为空。
- 实际开发优先用
not null——因为空值无法参与运算(如 null+1 结果仍为 null )。
1.2 创建含not null约束的表
create table myclass(
class_name varchar(20) not null,
class_room varchar(10) not null
);

查看表结构可以看到设置了not null属性的字段不允许为空,那么这些字段插入数据时不为空才能插入成功。

2. 默认值(default)
2.1 核心作用
如果某个字段经常出现某个值,那么可以考虑将这个值设置成该字段的默认值。插入数据时若不给带默认值的字段赋值,MySQL 会自动用默认值填充。
- 注意:
not null与default一般不同时用 —— 因为default已保证字段有默认值(不会空),再加not null属于重复约束,无意义。
2.2 创建含默认值的表
create table t1 (
name varchar(20) not null,
age tinyint unsigned default 0,
sex char(2) default '男'
);


3. 列描述(comment '...')
一般放在字段定义语句的末尾,仅用于开发 / 运维人员理解字段含义,对 MySQL 运行无任何影响。
3.1 创建含备注的表并查看备注
create table t2(
name varchar(20) not null comment '用户真实姓名(必填)',
age tinyint unsigned default 0 comment '用户年龄(默认0,非负)',
sex char(2) default '男' comment '用户性别(默认男,可选男/女)'
);
desc 表名只能看字段的类型、是否可空等基本信息,看不到 comment。必须用show create table 表名\G(\G 表示竖排显示,方便阅读)才能看列备注。

4. 零填充(zerofill)
4.1 核心作用
- 仅对数字类型字段生效:设置zerofill属性后,当字段值的宽度 < 数字类型后括号中的“显示宽度” 时,MySQL 会在值左侧自动补 0(如,设宽度 5,值是 1,显示为 00001)。
4.2 配置 zerofill 并验证

- 注意:zerofill属性只影响 “显示结果”,不改变实际存储值—— 比如显示 00001,数据库内部存储的还是 1——可用
hex()函数验证。

zerofill 常用于需要固定格式的数字,比如 “订单编号显示 8 位,不足补 0”(如 00000001、00000002)。
5. 主键(primary key)—— 面试高频
5.1 核心规则
向表插入多条数据后,查询某条记录时,为了快速,可选择某一/些字段设置为主键,比如学号作主键,一个学号值对应一个学生。
主键字段需同时满足“唯一”和“非空”两个硬性条件,缺一不可:
- 唯一:主键字段的值不能重复。
- 非空:主键字段不允许存储
null,因为空值无法作为有效标识定位记录。例如 “学号” 作主键,若某条记录的学号为null,则无法确定该记录对应哪个学生,违背主键 “唯一标识” 的核心作用
注意:定义主键时无需额外添加not null约束和unique约束,因为primary key本身自带这两个约束。
其他规则:
- 一张表最多只能有 1 个主键;
- 主键字段通常用整数类型(如 int unsigned),因为整数查询速度快;
- 支持 “复合主键”(多个字段联合唯一)。
5.2 主键
5.2.1 建表时直接指定主键

Key列出现PRI表明主键设置成功:

验证“唯一”性:

5.2.2 建表后删除/追加主键
(1)因为一个表只有一个主键,所以
alter table 表名 drop primary key;
即可去除指定表的主键设置:

(2)增设主键:
alter table 表名 add primary key(id);

5.3 复合主键
- 一个主键可由多个字段共同承担,这种叫做复合主键。
- 复合主键中多个字段的 “值组合” 不能重复,且组成复合主键的每个字段都默认不能为空。
5.3.1 建表时指定复合主键
比如创建一个stu表,含学号、姓名、成绩,“学号 + 姓名” 作为复合主键——“学号 + 姓名”不能完全重复,且学号和姓名都不能为空。
create table stu(
class int unsigned comment '班级(复合主键之一)',
name varchar(20) comment '姓名(复合主键之一)',
score tinyint unsigned default 0 comment '成绩(0-100分,默认0分)',
primary key(class,name)
);

“值组合”局部重复可插入成功:

“值组合”完全重复插入失败:

5.3.2 建表后删除/追加复合主键
(1)删除复合主键
alter table 表名 drop primary key;

(2)追加复合主键
alter table 表名 add primary key(列名1,列名2,...);

6. 自增长(auto_increment)—— 面试高频
6.1 核心作用
给设置了自增长属性的字段插入数据时如果不赋值,
- 若该字段无值,自动取 1 作值;
- 若该字段已有值,自动取 “当前字段最大值 + 1” 作为新值。
必须满足的 3 个条件:
- 字段是索引(key 一栏有值,比如主键、唯一键);
- 字段是整数类型(如 int、tinyint);
- 一张表最多 1 个自增长字段(通常和主键搭配,因为主键需要唯一值)。
6.2 主键 + 自增长配置(最常用)


7. 唯一键(unique)—— 面试高频
7.1 核心作用
- 保证字段值唯一,与主键对比如下:
对比项 主键(primary key) 唯一键(unique key) 数量限制 一张表最多 1 个 一张表可多个 是否允许空值 不允许(自动 not null) 允许(可多个空值,空值null不参与唯一性比较) 核心用途 标识行唯一性(如用户 ID) 保证业务唯一性(如手机号、邮箱)
7.2 创建含唯一键的表

验证唯一性:

允许(多个)空值:

8. 外键(foreign key)—— 面试高频
8.1 核心作用
- 外键用来定义 “主表” 和 “从表” 的关联关系(比如 “班级表” 是主表,“学生表” 是从表,学生属于某个班级),确保从表的 “关联字段” 值在主表中存在。
- 关键规则:
- 外键定义在从表上(如学生表的 class_id 设为外键);
- 主表的关联字段必须是主键或唯一键(如班级表的 id 是主键);
- 从表的外键值只能是:主表关联字段已有的值,或 null(如学生未分配班级)。
8.2
8.2.1 创建主表 + 从表(含外键)
步骤1:先创建主表——必须先创建主表,从表才能关联

步骤2:创建从表,关联主表的主键字段

查看从表结构,从表 class_id 的 key 列为 MUL 表明 class_id 成功被设置为外键:

8.2.2 验证外键规则
从表的外键值只能是:主表关联字段已有的值,或 null 。
9. 表设计实操(面试常考)
9.1 需求场景
设计 “商店购物系统” 的 3 张核心表,需满足:
- 商品表(goods):存商品信息,商品编号唯一且自增长;
- 客户表(customer):存客户信息,客户姓名必填,邮箱和身份证唯一,性别只能是 “男 / 女”;
- 购买表(purchase):存客户购买商品的记录,关联客户和商品(确保客户、商品存在)。
9.2 必掌握的完整代码
依次建表并查看表结构以确保设置正确:




1482

被折叠的 条评论
为什么被折叠?



