05-MySQL表约束

💬 :如果你在阅读过程中有任何疑问或想要进一步探讨的内容,欢迎在评论区畅所欲言!我们一起学习、共同成长~!

👍 :如果你觉得这篇文章还不错,不妨顺手点个赞、加入收藏,并分享给更多的朋友噢~!


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 nulldefault一般不同时用 —— 因为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 核心规则

向表插入多条数据后,查询某条记录时,为了快速,可选择某一/些字段设置为主键,比如学号作主键,一个学号值对应一个学生。

主键字段需同时满足“唯一”和“非空”两个硬性条件,缺一不可:

  1. 唯一:主键字段的值不能重复。
  2. 非空:主键字段不允许存储null,因为空值无法作为有效标识定位记录。例如 “学号” 作主键,若某条记录的学号为null,则无法确定该记录对应哪个学生,违背主键 “唯一标识” 的核心作用

注意:定义主键时无需额外添加not null约束和unique约束,因为primary key本身自带这两个约束。

 

其他规则

  1. 一张表最多只能有 1 个主键
  2. 主键字段通常用整数类型(如 int unsigned),因为整数查询速度快;
  3. 支持 “复合主键”(多个字段联合唯一)。

 

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 个条件:

  1. 字段是索引(key 一栏有值,比如主键、唯一键);
  2. 字段是整数类型(如 int、tinyint);
  3. 一张表最多 1 个自增长字段(通常和主键搭配,因为主键需要唯一值)。

 

6.2 主键 + 自增长配置(最常用)


7. 唯一键(unique)—— 面试高频

7.1 核心作用

  • 保证字段值唯一,与主键对比如下:
    对比项主键(primary key)唯一键(unique key)
    数量限制一张表最多 1 个一张表可多个
    是否允许空值不允许(自动 not null)允许(可多个空值,空值null不参与唯一性比较)
    核心用途标识行唯一性(如用户 ID)保证业务唯一性(如手机号、邮箱)

 

7.2 创建含唯一键的表

验证唯一性:

允许(多个)空值:

 


8. 外键(foreign key)—— 面试高频

8.1 核心作用

  • 外键用来定义 “主表” 和 “从表” 的关联关系(比如 “班级表” 是主表,“学生表” 是从表,学生属于某个班级),确保从表的 “关联字段” 值在主表中存在。
  • 关键规则
    1. 外键定义在从表上(如学生表的 class_id 设为外键);
    2. 主表的关联字段必须是主键或唯一键(如班级表的 id 是主键);
    3. 从表的外键值只能是:主表关联字段已有的值,或 null(如学生未分配班级)。

 

8.2

8.2.1 创建主表 + 从表(含外键)

步骤1:先创建主表——必须先创建主表,从表才能关联

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

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

8.2.2 验证外键规则

从表的外键值只能是:主表关联字段已有的值,或 null 。

 


9. 表设计实操(面试常考)

9.1 需求场景

设计 “商店购物系统” 的 3 张核心表,需满足:

  1. 商品表(goods):存商品信息,商品编号唯一且自增长;
  2. 客户表(customer):存客户信息,客户姓名必填,邮箱和身份证唯一,性别只能是 “男 / 女”;
  3. 购买表(purchase):存客户购买商品的记录,关联客户和商品(确保客户、商品存在)。

 

9.2 必掌握的完整代码

依次建表并查看表结构以确保设置正确:

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值