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

目录

🌴数据库约束

🚩约束类型

[🚩NOT NULL](#🚩NOT NULL)

🚩UNIQUE

🚩DEFAULT

[🚩PRIMARY KEY](#🚩PRIMARY KEY)

[🚩FOREIGN 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.理清楚实体之间的关系

大致分为以下三种:

🚩一对一

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

🚩一对多

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

🚩多对多

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

相关推荐
ROCKY_81719 分钟前
Mysql复习(二)
数据库·mysql·oracle
问道飞鱼3 小时前
【知识科普】认识正则表达式
数据库·mysql·正则表达式
HaiFan.3 小时前
SpringBoot 事务
java·数据库·spring boot·sql·mysql
水根LP493 小时前
linux系统上SQLPLUS的重“大”发现
数据库·oracle
途途途途3 小时前
精选9个自动化任务的Python脚本精选
数据库·python·自动化
04Koi.4 小时前
Redis--常用数据结构和编码方式
数据库·redis·缓存
silver98864 小时前
mongodb和Cassandra
数据库
PersistJiao4 小时前
3.基于 Temporal 的 Couchbase 动态 SQL 执行场景
数据库·sql
上山的月5 小时前
MySQL -函数和约束
数据库·mysql
zhcf5 小时前
【MySQL】十三,关于MySQL的全文索引
数据库·mysql