MySQL学习(8):约束

1.什么是约束

约束是作用于表中字段上的规则,以限制表中数据,保证数据的正确性、有效性、完整性

约束分为以下几种:

|-----------------------------|------|------------------------------|
| not null | 非空约束 | 限制该字段的数据不能为null |
| unique | 唯一约束 | 保证该字段的所有数据都是唯一、不重复的 |
| primary key | 主键约束 | 主键是一行数据的唯一标识,要求非空且唯一 |
| default | 默认约束 | 保存数据时,如果未指定该字段的值,则采用默认值 |
| check(从mysql 8.0.16版本起,才支持) | 检查约束 | 保证字段值满足某一个条件 |
| foreign key | 外键约束 | 用来让两张表的数据之间建立连接,保证数据的一致性和完整性 |

约束可以在创建或修改表时添加(DDL)

2.使用案例

2.1主键与自动增长

上述建表条件中的**自动增长(关键字为auto_increment)**的含义是 表内每多一条数据,字段自动加一

建表语句如下图:

如果向表中写入如下数据:

则结果如下:

可以看到虽然添加数据时没有输入id的值,但表内还是有id的值,且自动增长

每张表只能有一个自动增长项,通常为主键

2.2自动增长与unique约束的冲突

不过,自动增长有一种特殊情况:继续以上述表为例,向表中写入如下数据

明显,两处重复的tom3违反了name字段的unique约束,这条数据会因为报错不在表中产生。

其结果如下:

可以看到,id直接从3跳到了5。

这是因为unique约束条件需要创建出一行新的数据,再与先前的数据进行比对并加以拦截,这条数据在产生的时候就已经让受到auto_increment约束的字段加1了

其他的约束条件是在创建前加以拦截,因此不会产生这种情况

3.外键

外键用来在2个表之间建立联系。使用外键的表称为子表或从表,与之产生联系的表称为父表或主表

3.1使用语句

(1)创建表

复制代码
create table 表名(
字段名 数据类型,
...
[constraint] [外键名] foreign key (外键字段名) references 主表名(主表字段名)
);

(2)修改表

复制代码
alter table 表名 add constraint 外键名  foreign key (外键字段名) references 主表名(主表字段名);

(3)删除外键

复制代码
alter table 表名 drop foreign key 外键名;

3.2外键使用案例

主表(表名为dept)如下:

从表(表名为emp)如下:

要实现的效果是,让从表的dept_id字段与主表的id字段联系起来。

其使用的语句如下:

在建立了联系后,假如主表要删除 id为1 的那一行数据,数据库会报错。因为从表中外键字段dept_id中正在使用1

3.3外键删除更新行为

虽然在默认情况下主表不能删除从表外键使用的字段,但这可以通过设置从表行为来进行修改

外键有2种常用的删除更新行为:

(1)cascade:父表删除/更新对应记录时,数据库会先检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录。(父表删除记录后,并不是子表对应的外键处变为空,而是子表对应的一整行数据都被删除)

(2)set null:父表中删除/更新对应记录时,数据库会先检查该记录是否有对应外键,如果有,则设置子表中该外键值为nul。(这就要求该外键允许取null,即不可设置非空约束not null)

修改语句如下:

复制代码
alter table 表名 add constraint 外键名  foreign key (外键字段名) references 主表名(主表字段名)on update 行为名 on delete 行为名;
#on update后接的是主表更新时的子表行为
#on delete后接的是主表删除时的子表行为
相关推荐
西岸行者12 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意12 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码12 天前
嵌入式学习路线
学习
毛小茛12 天前
计算机系统概论——校验码
学习
babe小鑫12 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms12 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下12 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。12 天前
2026.2.25监控学习
学习
im_AMBER12 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J12 天前
从“Hello World“ 开始 C++
c语言·c++·学习