【Java.mysql】——数据删改(DU) 附加数据库约束

目录

🚩更新(Update)

🚩删除(Delete)

🚩数据库约束

🎈约束类型

✅NULL约束

✅NNIQUE 唯一约束

✅DEFAULT:默认值约束

✅PRIMARY KEY:主键约束

 ✅FOREIGN KEY:外键约束

🌈"子"不能增加和更新 "父"存在相关联的列

🌈"父"不能删除和更新 "子"存在相关联的列

🌈 外键是俩个表的 列 产生关联关系 ~其他列不受影响

 🌈父表中被关联的一列必须是主键或者unique

🌈不能删除父表 

 🌈电商网站(在线和下架商品)


上一节的内容我们讲述了 查询插入等基本操作,本章会讲述 修改 以及数据库约束。


还是进行这个表来操作。 


🚩更新(Update)

update 表名 set 列名=值 where 条件;

-- 将孙悟空同学的数学成绩变更为 80 分

 update exam_result set math=80 where name="孙悟空";


-- 将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分
 update exam_result set math=60,chinese=70 where name="曹孟德";


-- 将总成绩倒数前三的 3 位同学的数学成绩加上 30 分

我们分步走,首先我们先将总成绩算出来,然后排序,排成升序,那么前三个就是倒数前三个了,然后数学成绩+30;

我们执行上面的语句的时候,我们到超出数据范围,我们看到math再第二行超出返回,math的数据类型是decimal(3,1),但是85.0+30=115.0超出了数字长度是3的事实,所以报错。

让数据-30是完全可以的, 因为数字长度是3, 小数点后一位长度。

-- 将总成绩倒数前三的 3 位同学的数学成绩减少 30 分


-- 将所有同学的语文成绩更新为原来的 2 倍

出现了同样的问题,我们看看每个学生的语文成绩。

我们看到chinese的数据范围也同样是 decimal(2,1),数字长度是2,小数点后一位。*2之后67*2=134.0超出了decimal范围,就会报错。


-- 将所有同学的语文成绩更新为原来的 1/2 倍 

改变了7行,但是警告有2个,这是为什么?

如果语文成绩是空的话,是无法改变的。那么就会显示Rows matched:8 Changed:7 Warning:2

显示警告 show warnings;

数据发生截断在第2行和第5行。

由于语文成绩的范围是dcimal(2,1),数据长度是2,小数留一位小数。所以数据自动发生了截断。


🚩删除(Delete)

delect from table  [WHERE ...] [ORDER BY ...] [LIMIT....];
删除孙悟空同学的考试成绩
 DELETE FROM exam_result WHERE name = '孙悟空';


删除整张表数据

delete from test;只删除表中所有的数据,不删除表

drop table test; 删除所有数据和表。

这时候就没有这个表了。


🚩数据库约束

有的时候,数据库中的数据是有一定要求的,有些数据认为是合法数据,有些是非法数据,

数据库,自动的对数据的合法性进行校验检查的一系列机制——目的就是为了保证数据库中能够避免被插入/修改一些非法数据。所以这时候需要数据库约束


🎈约束类型

  • NOT NULL - 指示某列不能存储 NULL 值。
  • UNIQUE - 保证某列的每行必须有唯一的值。
  • DEFAULT - 规定没有给列赋值时的默认值。
  • PRIMARY KEY - NOT NULL UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
  • FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
  • CHECK - 保证列中的值符合指定的条件。对于MySQL数据库,对CHECK子句进行分析,但是忽略CHECK子句

NULL约束

我们重新创建一个表,设置id是不能为空的。

我们插入数据的时候,如果给id赋值为空,那么就会报错。


NNIQUE 唯一约束

表示sn列为唯一的,不重复的。


✅DEFAULT:默认值约束

指定插入数据时,name列为空,默认值unkown

当我们后续插入数据的时候,default就会在没有显式指定插入的值的时候生效了。(上面我只给id,sn,qq_mail)插入数据了,并没有给name插入数据,所以最终查看表的时候,name是defaule。


✅PRIMARY KEY:主键约束

primary_key其实是not null和unique的结合,所以我们不用再单写非空或者唯一的约束了,只需要写上主键约束的。

这个是最重要的约束,一行记录的身份标识。

一张表中只能有一个primary key,一个表里的记录,只能有一个作为身份标识的数据。

虽然只能有一个主键,但是主键不一定只是一个列,也可以多个列共同构成一个主键(联合主键)

id一行null被设置成not null,key是主键。

那么如何保证主键唯一呢?

对于整数类型的主键,常配搭自增长auto_increment来使用。插入数据对应字段不给值时,使用最大值+1。

mysql提供了一种“自增主键”这样机制,主键经常会使用int/bigint,程序员再插入数据的时候,不必手动指定主键值,由数据库服务器自己给你分配一个主键,会从1开始,依次递增的分配主键的值。

null其实是交给数据库服务器自动分配的,会自动增加。

 如果我们突然加个id=10的编号学生,如果再加个id=null,那么这次的id是11。自动增加id。就是从刚才的最大的数值开始,继续往后分配的。相当于使用一个变量保存了当前表的id的最大值,后续分配自增主键都是根据这个最大值分配的,如果手动指定id,也会更新最大值。


 ✅FOREIGN KEY:外键约束

描述俩个表之间的关联关系。

class(classId,name)100 计科1班101 计科2班102 计科3班103 计科4班
student(id,name,classId)1  张三  1002  李四  1003  陈陈  1024  乐乐  200

外键就是用来描述这样的约束过程的。class表中的数据,约束了student表中的数据,

  • 把class表称为"父表",约束别人的表,
  • 把student表,称为"子表",被别人约束的表。

如果我们插入class表中加入上述数据,但是插入student表加一个classId不等同于class表中的classId,这样就不构成了关联关系。我们不能通过classId找到关联关系。

从这我们可以看到其实就是普普通通的俩个独立的表,并没有关联的表,只是这俩个表都有classId属性而已。那样再正常的创建表是没有问题,但是再运用到俩表之间的关联问题是有问题的。所以我们就得设置外键约束。

我们给学生表中的classId设置成外键,用foreign key (被约束的列) references 约束的表(约束的列).这样俩表之间就产生了联系。


🌈"子"不能增加和更新 "父"存在相关联的列

如果插入到student表中的classId是没有再class表中的classId存在的话,那么就会报错。我们分析一下报错信息。

这个错误说明正在试图插入或更新一个“子”行,但是它引用的“父”行在相关的父表中不存在。

例如,假设有一个名为 "订单" 的表和一个名为 "客户" 的表。订单表中有一个外键,指向客户表中的客户ID。如果你试图向订单表中插入一个订单,但是你提供的客户ID在客户表中不存在,那么就会出现这个错误。这个例子就和上面的例子一样的,student表有个外键,指向的是class表中的classId,如果你要给student表中插入一个学生(但是你提供的学生班级ID是在class表中不存在,这就报错了。因为上面我插入给student表中的classId是120,但是我们在class表中我们发现

为解决这个问题,你需要确保在进行插入或更新操作之前,相关的父表中存在对应的行。或者,你可以选择允许空值或者使用默认值来避免外键约束。


🌈"父"不能删除和更新 "子"存在相关联的列

如果针对父表进行 修改/删除 操作,如果当前被修改/删除的值已经被子表引用了,这样的操作也会失败。外键约束始终要保持,子表中的数据在对应的父表的列中,要存在,如果万一父表的这条数据删除的,也就打破了刚才的约束了,除非先删除子表相关联的列,再删除子表引用的列的父表。

  尝试删除或更新一个“父”行,但是这个父行有一个或多个“子”行引用了它。这个错误说明正在试图删除或更新一个“父”行,但是它有一个或多个“子”行引用了它,因此数据库系统拒绝了这个操作。

        例如,假设有一个名为 "作者" 的表和一个名为 "书籍" 的表。书籍表中有一个外键,指向作者表中的作者ID。如果你试图从作者表中删除一个作者,但是该作者有一本或多本书在书籍表中,这些书籍的作者ID指向了被删除的作者,那么就会出现这个错误。

        为了解决这个问题,你需要先删除或更新所有子行,以确保它们不再引用被操作的父行,然后再执行删除或更新操作。或者,你可以选择在定义外键约束时指定级联选项,以便在父行被删除或更新时自动处理相关的子行。


🌈 外键是俩个表的 列 产生关联关系 ~其他列不受影响

这样是不影响,真正影响的是俩个表相关联的列产生的,不能改class表中的classId,因为和子表有关联。


 🌈父表中被关联的一列必须是主键或者unique

当我们重新创建父表和子表的时候,我们看到外键不能被约束了,我们可以看到 student表关联的是class表中的classId,但是class表中的classId不是主键,我们规定指定外键约束的时候,要求父表中被关联的这一列,得是主键或者unique。


🌈不能删除父表 

删除表前提是先删除记录,删表肯定是不可以的,你还有子表相关联,父表没了,子表后续添加元素,就没有参考了,正确的删除方式是先删除子表,然后删除父表即可。

此时删除成功。


 🌈电商网站(在线和下架商品)

我们创建好商品表和订购单表,然后我们考虑一下,过了一段时间之后,商家想把这个衬衫下架(删除掉) 如何删除?(尝试删除父表数据的同时,如果父表的数据被子表引用了,是不能删除的,就会报错了,那么再这种情况下,如何保证外键约束存在的前提下,实现“商品下架"功能呢?

解决方法就是 :给商品表增加一列,表示是否在线(不在线,相当于下架了)

alter table 表名 add column 列名 类型(default 默认值);

我们将表增加一个列isOk默认值是1,1代表商品在线,0代表商品下线。所以我们如果需要下架商品的时候,就使用update把isOk从1-》0即可。查询商品的时候,都加上where isOk=1这样的条件。

我们向goods表中插入值。

向orders订单表中插入数据。

使用场景一:如果我们要下架"裤子"类型的商品

只需要将 更新isOk的值,条件是 类型是裤子

使用场景二: 如果要查询正在卖的商品类型(也就是isOk=1)

只需要where isOk=1即可


有些瞬间,会支撑着我。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/774981.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是字典序?字典序详解

字典序,也称为词典序、字典顺序、字母序或词序,是指在排序时,按照字母顺序或数字顺序等自然顺序进行排序的方法。通常,字典序应用于字符串排序,但也适用于其他类型的数据结构。 对于字符串来说,字典序的排…

探究 Switch Case 和 While 循环:两种强大的控制结构

在计算机编程中,控制结构是指用于控制程序执行流程的特殊语句或语法。这些结构使程序能够根据不同的条件执行不同的操作,从而增强了程序的灵活性和功能性。本文将介绍两种常见的控制结构:Switch Case 和 While 循环,并通过示例代码…

【前端】Layui的表格常用功能,表单提交事件,表格下拉按钮点击事件,表格外的按钮点击事件

欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《前端》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握…

使用vue-quill-editor实现图片截图复制粘贴上传

需求 运营需要用多张图片进行OCR识别,图片来源一般是运营的截图,直接粘贴过来,然后需求请求OCR截图提交图片list,粘贴图片的同时需要上传图片到cdn地址; 分析 一个输入框(富文本框)&#xff…

高阶SQL语句(二)

一 子查询 也被称作内查询或者嵌套查询,是指在一个查询语句里面还嵌套着另一个查询语 句。子查询语句 是先于主查询语句被执行的,其结果作为外层的条件返回给主查询进行下一 步的查询过滤。 ①子语句可以与主语句所查询的表相同,也可以是不…

STM32收发HEX数据包

在实际应用中,STM32的串口通信都是以数据包格式进行收发,这个数据包一般都包含包头和包尾,表示一个数据包。源代码在文末给出 数据包格式: 固定长度,含包头包尾 可变包长,含包头包尾 问题1:当…

YoloV5改进策略:BackBone改进|ECA-Net:用于深度卷积神经网络的高效通道注意力

摘要 本文使用ECA-Net注意力机制加入到YoloV5中。我尝试了多种改进方法,并附上改进结果,方便大家了解改进后的效果,为论文改进提供思路。(更新中。。。。) 论文:《ECA-Net:用于深度卷积神经网…

183. 从不订购的客户

文章目录 题意思路代码 题意 题目链接 查找未出现在orders表里面的内容 思路 子查询not in 代码 select name as Customers from Customers where id not in (select customerId from Orders group by customerId)

86.分隔链表

给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示例 1: ​ 输入:head [1,4,3,2,5,2], x 3 输出&…

前端学习之JavaScript有关字符串的一些方法

&#xff08;注释是对各个方法的一些解释&#xff09; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>字符串</title> </head> <body><script>let str1 test1let str2 n…

前端性能优化:掌握解决方案

课程介绍 我们常说性能永远是第一需求&#xff0c;作为一个前端工程师&#xff0c;不管使用什么框架&#xff0c;不管从事什么类型的网站或应用开发&#xff0c;只要是项目被用户使用&#xff0c;性能优化就永远是你需要关注的问题。通常情况下&#xff0c;工程师们在深入了解…

[C++打怪升级]--学习总目录

总结C打怪升级学习目录&#xff0c;便于翻阅&#xff0c;制作不易&#xff0c;点个赞吧&#xff0c;感谢&#xff01; 基础入门 ​​​​​​[C基础入门]&#xff08;一&#xff09;&#xff1a;初识 [C基础入门]&#xff08;二&#xff09;&#xff1a;数据类型 [C基础入门…

esp32c6 micropython固件首发

挺久没写正经文章了&#xff0c;主要是micropython确实也没那么多可挖掘的东西&#xff0c;这次带来的是micropython esp32c6 抢先版的固件&#xff0c;是df论坛的一位大佬编译的&#xff0c;属于测试阶段 固件下载地址 我30岁开始学编程&#xff0c;现在33了&#xff0c;终于程…

白板手推公式性质 AR模型 时间序列分析

白板手推公式性质 AR模型 时间序列分析 视频讲解&#xff1a;https://www.bilibili.com/video/BV1D1421S76v/?spm_id_from.dynamic.content.click&vd_source6e452cd7908a2d9b382932f345476fd1 B站对应视频讲解(白板手推公式性质 AR模型 时间序列分析)

[C语言]带连接数统计功能的多进程TCP服务器

编程思想: so,我们一分钱没花改造了一个简易TCP服务器,具体的: 1 当accept正常返回后,创建一个子进程用于处理数据 2 在子进程中 关闭socket返回的fd,在父进程中关闭accept返回的fd,防止资源泄露及不可预知的风险 3 父进程中忽略子进程结束信号,等于自动回收,防止变僵尸 当…

hdlbits系列verilog解答(Hadd)-65

文章目录 一、问题描述二、verilog源码三、仿真结果一、问题描述 本节我们创建一个半加法器。半加法器将两个位相加(无进位)并产生求和和进出。 模块声明 module top_module( input a, b, output cout, sum ); 思路: 可用真值表写出逻辑表达式,或者直接用数据流方式。 二…

Qt 压缩/解压文件

前面讲了很多Qt的文件操作&#xff0c;文件操作自然就包括压缩与解压缩文件了&#xff0c;正好最近项目里要用到压缩以及解压缩文件&#xff0c;所以就研究了一下Qt如何压缩与解压缩文件。 QZipReader/QZipWriter QZipReader 和 QZipWriter 类提供了用于读取和写入 ZIP 格式文…

linux 多个文件(csv)合并成一个文件(csv)

文章目录 前言实例:实战:另外&#xff0c;补充一个相关知识 总结 前言 Linux之cat合并多个文件 实例: # 将当前目录下所有csv结尾的文件合并到merge.csv cat *.csv > merge.csv # 当然也可以指定合并哪几个文件 cat db1.sql db2.sql db3.sql > db_all.sql 实战: 将每个…

好物视频素材哪里找?推荐以下几个自用很好的视频素材库

好物视频素材哪里找&#xff1f;这可是个让很多创作者头疼的问题。想制作一个吸引人的视频&#xff0c;好的素材可是关键。下面就给大家介绍几个热门的视频素材网站&#xff0c;希望能帮到你&#xff01; 蛙学网&#xff08;https://www.waxuewang.com/&#xff09;&#xff1…

国产数据库序列机制

数据库 达梦 序列&#xff1a;支持 主键自增&#xff1a;支持 使用序列 //1.创建序列 create sequence <序列名> increment by 10...; //2.使用序列&#xff0c;插入时指定&#xff0c;或者设计表字段默认值为seq1.nextval insert into <表名>(id,...) values…