当前位置: 首页 > news >正文

【MySQL】增删改查-进阶(一)

目录

🌴数据库约束

🚩约束类型

🚩NOT NULL

🚩UNIQUE

🚩DEFAULT

🚩PRIMARY KEY

🚩FOREIGN KEY

🚩CHECK

 🎄表的设计

🚩一对一

🚩一对多

🚩多对多


🌴数据库约束

约束可以理解成,数据库提供的一种针对数据的合法性,验证的一种机制。

数据库中经常会涉及到大量的数据,也会涉及到大量的增删改查操作,如果数据库不提供这样的校验机制,就只能靠程序员手工来保证数据是靠谱的,但是一旦涉及到人工基本认为是不靠谱的,所以通过程序自动化的检查,才是更科学的。

🚩约束类型

NOT NULL - 指示当前列不能存储 NULL 值。

UNIQUE - 保证某列的每行必须有唯一的值(不能重复)。

DEFAULT - 规定没有给列赋值时的默认值,没有设置即为NULL。

PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。称为主键,确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。

FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性,称为外键。

CHECK - 保证列中的值符合指定的条件。对于MySQL数据库,对CHECK子句进行分析,但是忽略CHECK子句。但是MySQL5.7不能使用

🚩NOT NULL

不能为空!

不加not null:

加上not null:

当我们插入空值时,就会报错:

不只是针对插入操作,对于修改操作也是一样的:

🚩UNIQUE

确保唯一性!

不加unique约束:可重复插入

加上unique约束:

加上unique之后效率就会降低,但是对数据的校验就更严格了!

🚩DEFAULT

设置默认值!设置好了之后,后续进行指定列插入的时候,未被指定的列就会保持默认值。

当前这张表中,默认的默认值就是NULL

当我们指定列插入时,未被指定的列默认值就是NULL:

修改默认值:

注意:unique和default是有一定冲突的,unique是不能重复,但是设置default之后,当多个未被指定列插入时就为空,这是重复的,使用是注意两个用法!

🚩PRIMARY KEY

主键:一条记录的身份标识

例如,在C语言中,我们可根据两个变量的地址来判断是否是同一个变量,这个地址就是身份标识。在MySQL中,通过主键来判断是否为同一条记录。

在MySQL中,主键的两个要求:

  1. 不能为空
  2. 不能重复

设置主键: 

插入数据:

一般给表设置主键时,都是使用数字(整数形式),很少使用字符串。且一个表只能有一个主键。

 primary key = not null + unique,即创建主键时还可以直接使用not null + unique的形式创建:

上述谈到,一般主键会使用整数id作为主键,但是在实际开发中,id的值该如何选择,如何确定你插入id的值是唯一的呢?

自增主键:mysql中提供了自增主键,每次插入新的数据,都可以把主键基于上一条数据的主键 +1

设置自增主键:

插入数据:此时就不需要手动指定主键了

也可以手动插入,不一定非要使用自增主键:

此时,当我们再次使用自增主键插入时,得到的id就是101了:

当我们删掉101这条数据时,再次使用自增主键插入id为102:

自增主键的其他场景:

🚩FOREIGN KEY

外键约束,两张表直接的关联关系,例如学生表和班级表。

不指定外键约束:

创建班级表

创建学生表:原则上来说,插入学生表的数据中的classId,必须要在class表中存在,插入的学生才是有意义的(从属于某个班级),但是呢插入了一个班级为100这样的数据,正常来说是不能插入成功,这里却插入成功了。这就是一条有问题的数据

加上外键约束:

创建班级表

创建学生表(指定外键约束)

在学生表中插入数据,会受到外键约束的制约

在学生表中修改数据,也会受到外键约束的制约

修改父表:

尝试直接删除父表中的数据,发现这里的删除操作成功了,但是这里所删除的classId为3的班级,其实并没有被学生表所引用,我们在上述将id为3的这条记录进行了修改到classId为2的班级,所以能删除成功!

删除另一个班级,这里就删除失败了,即父表也受子表的约束!他们是双向的!

修改即一样!

创建外键的注意事项:

删除表时,现删除子表,再删父表

创建表,发现此时却创建不了了,是因为引用的父表这一列要么是主键,要么是unique,要具有唯一性,由于这里没有设置主键,即失败。

🚩CHECK

 🎄表的设计

给你一个需求场景,能够结合场景把表如何创建给写出来,有几个表,每个表是干啥的,每个表里都有哪些属性,这些属性之间是否有一些关联关系......

设计表的通用步骤:

  • 1.理清楚需求场景中的"实体"(entry)有哪些.

实体即为面向对象中的对象,所谓对象也就是针对实际问题中的一些实际情况,在代码中进行"抽象的表示"。

所谓抽象,信息量越多越具体,信息量越少越抽象。

  • 2.理清楚实体之间的关系

大致分为以下三种:

🚩一对一

一个人只有一个身份证号,一个身份证号对应一个人

🚩一对多

一个班级包含多个学生,一个学生只能有一个班级

🚩多对多

一个学生对应多个课程,一个课程对应多个学生

http://www.lryc.cn/news/462558.html

相关文章:

  • MacOS RocketMQ安装
  • OpenCV高级图形用户界面(6)获取指定窗口中图像的矩形区域函数getWindowImageRect()的使用
  • SpringColoud GateWay 核心组件
  • 5.计算机网络_抓包工具wireshark
  • 基于Java的车辆管理系统的设计与实现-计算机毕业设计源码41727
  • 在软件开发中低耦合和高内聚是什么,如何实现,请看文章
  • 关于MyBatis-Plus 提供Wrappers.lambdaQuery()的方法
  • C++——vector的了解与使用
  • Ubuntu设置静态IP地址
  • 力扣349.两个数组的交集
  • FreeRTOS - 软件定时器
  • Python的Atlassian第三方库的详细介绍
  • Java中的基本循环结构详解
  • 关于Git Bash中如何定义alias
  • luckfox1106初次使用
  • ab命令深入解析:ApacheBench性能测试工具
  • VSCode创建VUE项目(二)前端登录页面
  • centos 8.4学习小结
  • AI 设计工具合集
  • mac 源代码安装openresty
  • 人工智能和机器学习之线性代数(二)
  • Postman中的form-data 和 JSON 的区别
  • 网络安全基础知识点_网络安全知识基础知识篇
  • Vue.js 从入门到精通:全面解析组件化、路由与状态管理(附 Todo 案例)
  • AI Weekly#1:过去一周重要的AI资讯汇总
  • 图论刷题
  • ICM20948 DMP代码详解(85)
  • 深入解析:Linux tcpdump命令在网络流量分析中的实战应用
  • Java集合常见知识总结(上)
  • 【算法】力扣:K个一组反转链表