MySQL 增删改查进阶 — 数据库约束

文章目录

  • 数据库约束
    • 1.约束类型
      • 1.1 not null
      • 1.2 unique 唯一约束
      • 1.3 主键约束 primary key
      • 1.4 default 默认值
      • 1.5 外键约束 foreign key

数据库约束

约束就是让数据库帮助程序猿更好的检查数据是否正确

1.约束类型

  • not null - 提示某列不能存储 NULL 值。
    允许为空,选填项;不允许为空,必填项。
  • unique - 保证某列的每行必须有唯一的值。
    表里存的数据不能有重复的值。
  • default - 规定没有给列赋值时的默认值。
  • primary key - not null 和 unique 的结合,确保某列(或两个列多个列的结合)有唯一表示有助于更容易更快速地找到表中一个特定的记录。
    每条记录的身份标识。
  • foreign key - 保证一个表中数据匹配另一个表中的值的参照量整性。
    多个表中的关联关系,要求某个记录必须在另一个表中存在。

1.1 not null

先创建一个表

MySQL 增删改查进阶 — 数据库约束_第1张图片

NULL 这一列描述了是否允许是空。

当加上了 not null 之后,NULL 这一列就变成不允许为 NULL。

name 这一列未被指定,所以是 YES。

MySQL 增删改查进阶 — 数据库约束_第2张图片
可以发现往 id 这一列插入 null 记录时,就报错了。

1.2 unique 唯一约束


创建一个表

MySQL 增删改查进阶 — 数据库约束_第3张图片
UNI 就是 unique 的简写。


MySQL 增删改查进阶 — 数据库约束_第4张图片
再次插入 id 为1的记录是就报错了,而插入新的 id 记录时就不会报错了。

数据库是先查找这一条记录是否有相同的,若没有才会插入。

一个列可以可以同时加上多个约束。


例如加上 not null 和 unique :

MySQL 增删改查进阶 — 数据库约束_第5张图片
PRI 就是 接下来要介绍的 primary key 的简写。

1.3 主键约束 primary key


MySQL 增删改查进阶 — 数据库约束_第6张图片


MySQL 增删改查进阶 — 数据库约束_第7张图片
可以根据报错信息得出被 primary key 约束的 id 列既不能是 NULL 的,也不能是重复的记录。


因为主键和 unique 都有先查询的过程,mysql 就会默认给 primary key 和 unique 这样的列自动添加索引(后面会讲),来提高查询的速度 。


注意:

  • 实际开发中大部分的表一般都会带有一个主键,主键往往是一个整数表的 id 。
  • 在 mysql 中,一个表里只能有一个主键。

  • 虽然主键不能有多个,但是mysql允许把多个列放到一起共同作为一个主键。
  • 主键另外一个常用方法是使用 mysql 自带的自增主键作为主键的值。


MySQL 增删改查进阶 — 数据库约束_第8张图片
圈出的部分表示插入 id 的时候可以手动指定,也可以不手动指定(null),mysql 会自动生成。


MySQL 增删改查进阶 — 数据库约束_第9张图片
这个操作不是说设成null值,而是交给数据库设成自增主键。


演示:

MySQL 增删改查进阶 — 数据库约束_第10张图片
id 会一直按照最大值下后排列。


也可以手动指定!!!


演示:

MySQL 增删改查进阶 — 数据库约束_第11张图片
在下一条数据插入一个101。


每次插入数据的时候,mysql 就会自动找到上一条记录的 id ,在这个基础之上,进行自增。


如果先是采用自增插入之后,再采用手动插入,之后再采用自增插入会从6开始还是会从102开始?

演示:

MySQL 增删改查进阶 — 数据库约束_第12张图片

可以发现是接着上一条记录的 id ,是按照之前的最大值来往后累加的!!!

1.4 default 默认值




插入记录的时候如果有具体的数据,则以插入的为准。

MySQL 增删改查进阶 — 数据库约束_第13张图片


如果没有,就以设置的默认值为准

MySQL 增删改查进阶 — 数据库约束_第14张图片

1.5 外键约束 foreign key


MySQL 增删改查进阶 — 数据库约束_第15张图片
可以查看学生是在哪个班级,看学生是否存在。
学生表和班级表两个表相互约束就称为外加约束。

MySQL 增删改查进阶 — 数据库约束_第16张图片
没有100班级,也就是非法的数据。
可以简单理解为不是本班的学生。

为了让mysql帮助程序猿完成上述的的检查动作,就引入了外键约束!!!



此时外键约束的含义就是要求 student 表里的务必要在 class 表里的 id 列中存在的。

\

MySQL 增删改查进阶 — 数据库约束_第17张图片
可以看到第一条记录,因为calss表中 1 是存在的,因此插入成功。
但是 101 是不存在的,因此插入失败,此时就不能随便的插入了。


学生表中的数据,要依赖班级表的数据,班级表的数据要对学生表产生约束力。
就像是父亲对孩子的约束力。

此处起到约束作用的班级表就叫做“父表”(parent);被约束的表就叫做“字表”(child)。
子表也可以反过来约束父表。


无论是添加还是修改,只要子表里的记录没在父表中存在,都会产生同样的报错信息。



如果要想删除,只能先删除子表,再删除父表。

MySQL 增删改查进阶 — 数据库约束_第18张图片

要想创建外键,就要求父表的对应的列,得有 primary key 或者 unique 约束!!!


此时没有primary key 或者 unique 进行约束,所以就报错了。



现在考虑一个场景:电商

有一个商品表,商品表里有很多商品。
还有一个订单表,订单里有商品id这一列。

商品表:
goods(id, name , unitprice);
存在商品编号、商品名称、商品价格。

例如:

商品编号:1、商品名称:衣服 、商品价格: 100
商品编号:2、商品名称:鞋子 、商品价格: 200



订单表:
order(orderid, goodsid, time);
存在订单id、商品id、订单生成时间。

例如:

订单id: 1、商品id: 1、订单生成时间: 2022-11-10
订单id: 2、商品id: 2、订单生成时间: 2022-11-12

订单中的商品id必须要在商品表中存在。


现在这个衣服订单太多了,要将这个商品下架。
需要怎么做?

解决思路:

要想对商品下架并不是删除记录了。
而是把“是否下架”这个属性设置成是。

这种方法叫逻辑删除,并不是真正的删除。

逻辑删除引发的问题:

MySQL 增删改查进阶 — 数据库约束_第19张图片

解决办法:

由于硬盘空间是不值钱的,因此充钱可以解锁海量的硬盘空间!!!

你可能感兴趣的:(MySQL,mysql,数据库,增删改查)