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后接的是主表删除时的子表行为
相关推荐
我命由我1234515 分钟前
Photoshop - Photoshop 工具栏(22)单行选框工具
学习·ui·职场和发展·求职招聘·职场发展·学习方法·photoshop
User_芊芊君子1 小时前
【成长纪实】我的鸿蒙成长之路:从“小白”到独立开发,带你走进鸿蒙的世界
学习·华为·harmonyos·鸿蒙开发
嵌入式-老费3 小时前
自己动手写深度学习框架(快速学习python和关联库)
开发语言·python·学习
执笔论英雄3 小时前
【大模型训练】zero 学习及deepseed实战
人工智能·深度学习·学习
前路不黑暗@5 小时前
Java:继承与多态
java·开发语言·windows·经验分享·笔记·学习·学习方法
2501_916007475 小时前
从零开始学习iOS App开发:Xcode、Swift和发布到App Store完整教程
android·学习·ios·小程序·uni-app·iphone·xcode
_dindong7 小时前
牛客101:递归/回溯
数据结构·c++·笔记·学习·算法·leetcode·深度优先
笨鸟笃行7 小时前
百日挑战——单词篇(第十二天)
学习
lingggggaaaa8 小时前
小迪安全v2023学习笔记(一百四十三讲)—— Win系统权限提升篇&AD内网域控&NetLogon&ADCS&PAC&KDC&CVE漏洞
windows·笔记·学习·安全·内网安全·权限提升
71-38 小时前
牛客上的练习题——打印X形图案(有说明scanf返回值)
c语言·笔记·学习