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后接的是主表删除时的子表行为
相关推荐
speop19 分钟前
【datawhale组队学习】TASK01|课程导论:站在认知范式的临界点
人工智能·学习
roman_日积跬步-终至千里1 小时前
【人工智能原理(1)】要点总结:从搜索、学习到推理的智能之路
人工智能·学习
我不会写代码njdjnssj1 小时前
SSM框架学习
学习
阿蒙Amon1 小时前
JavaScript学习笔记:14.类型数组
javascript·笔记·学习
代码游侠2 小时前
学习笔记——写时复制(Copy-on-Write)
linux·网络·笔记·学习·写时复制
阿蒙Amon2 小时前
JavaScript学习笔记:3.控制流与错误处理
javascript·笔记·学习
HalvmånEver2 小时前
Linux:基础IO(终)
linux·运维·c++·学习·缓冲区·libc
昵称只无法修改2 小时前
计算机底层原理
学习
charlie1145141912 小时前
在上位机上熟悉FreeRTOS API
笔记·学习·嵌入式·c·freertos·工程
EveryPossible2 小时前
状态丢失问题
学习