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后接的是主表删除时的子表行为
相关推荐
白慕慕1 小时前
文档网站大全
学习
一轮弯弯的明月3 小时前
Python基础-速通秘籍(下)
开发语言·笔记·python·学习
charlie1145141915 小时前
2026年正点原子开发板移植方案——从0开始的Rootfs之路(3)inittab 与 init 系统:Linux 启动的“第一号进程“全解析
linux·驱动开发·学习·嵌入式开发·嵌入式linux
wsx_iot6 小时前
TDengine学习
数据库·学习·tdengine
AI成长日志6 小时前
【笔面试算法学习专栏】二分查找专题:力扣hot100经典题目深度解析
学习·算法·面试
m0_564914927 小时前
AI学习课堂网站丨OPENMAIC丨清华团队开源项目
学习
开源盛世!!8 小时前
3.26-3.27学习笔记
笔记·学习
我的xiaodoujiao9 小时前
API 接口自动化测试详细图文教程学习系列7--相关Python基础知识6
python·学习·测试工具·pytest
山川行9 小时前
Python快速闯关8:内置函数
java·开发语言·前端·笔记·python·学习·visual studio
charlie1145141919 小时前
嵌入式C++教程实战之Linux下的单片机编程:从零搭建 STM32 开发工具链(2) —— HAL 库获取、启动文件坑位与目录搭建
linux·开发语言·c++·stm32·单片机·学习·嵌入式