【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.rhkb.cn/news/288390.html

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

相关文章

性价比高一点的diy台式主机怎么搭配?

怎么搭配一台性价比高一点的台式机 建议: 选择合适的CPU和GPU。根据实际需求选择相对较新的CPU和GPU型号,以确保能够运行目标应用程序和游戏。 合理选择内存和存储。根据预算选择适当的内存和存储容量。8GB或16GB内存对于一般计算和游戏使用足够了&…

YOLOv9改进策略:IoU优化 | Wasserstein Distance Loss,助力小目标涨点

💡💡💡本文独家改进:基于Wasserstein距离的小目标检测评估方法 Wasserstein Distance Loss | 亲测在多个数据集能够实现涨点,对小目标、遮挡物性能提升明显 💡💡💡MS COCO和PASC…

【深度学习】深度学习md笔记总结第2篇:TensorFlow介绍,学习目标【附代码文档】

深度学习笔记完整教程(附代码资料)主要内容讲述:深度学习课程,深度学习介绍要求,目标,学习目标,1.1.1 区别,学习目标,学习目标。TensorFlow介绍,2.4 张量学习目标,2.4.1 张量(Tensor),2.4.2 创建张量的指令,2.4.3 张量…

腾讯云服务器多少钱一年?最新价格4核8G服务器646元15个月

2024年腾讯云4核8G服务器租用优惠价格:轻量应用服务器4核8G12M带宽646元15个月,CVM云服务器S5实例优惠价格1437.24元买一年送3个月,腾讯云4核8G服务器活动页面 txybk.com/go/txy 活动链接打开如下图: 腾讯云4核8G服务器优惠价格 轻…

JavaWeb解压缩漏洞之ZipSlip与Zip炸弹

前言 前面一篇博文《Android Zip解压缩目录穿越导致文件覆盖漏洞》介绍过 Android 系统 Zip 文件解压缩场景下的目录穿越漏洞,近期在学习 JavaWeb 代码审计的时候从 github 看到《OpenHarmony-Java-secure-coding-guide.md》中“从 ZipInputStream 中解压文件必须进…

如何理解CDN?说说实现原理?

一、是什么 CDN (全称 Content Delivery Network),即内容分发网络 构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降…

Lua热更新(xlua)

发现错误时检查是否:冒号调用 只需要导入asset文件夹下的Plugins和Xlua这两个文件即可,别的不用导入 生成代码 和清空代码 C#调用lua using Xlua; 需要引入命名空间 解析器里面执行lua语法 lua解析器 LuaEnv 单引号是为了避免引号冲突 第二个参数是报错时显示什么提示…

pytorch常用的模块函数汇总(1)

目录 torch:核心库,包含张量操作、数学函数等基本功能 torch.nn:神经网络模块,包括各种层、损失函数和优化器等 torch.optim:优化算法模块,提供了各种优化器,如随机梯度下降 (SGD)、Adam、RMS…

工业物联网关的应用及相关产品-天拓四方

随着科技的飞速发展,智能制造业已成为工业领域的转型方向。在这一转变中,工业物联网关发挥着至关重要的作用。作为连接物理世界与数字世界的桥梁,工业物联网关不仅实现了设备与设备、设备与云平台之间的互联互通,更通过实时数据采…

Fabric Measurement

Fabric Measurement 布料测量

低功耗、低成本 NAS 的可能性

使用现状:多台工作电脑,家里人手一台,还在两个住处 有好几台工作电脑,不同电脑有不同的用途,最大的问题就是各个电脑上文件的同步问题,这里当然就需要局域网里的公共文件夹,在NAS的问题上查了网…

FreeRTOS(三)

第二部分 事件组 一、事件组的简介 1、事件 事件是一种实现任务间通信的机制,主要用于实现多任务间的同步,但事件通信只能是事件类型的通信,无数据传输。其实事件组的本质就是一个整数(16/32位)。可以是一个事件发生唤醒一个任务&#xff…

【C语言进阶篇】编译和链接

【C语言进阶篇】编译和链接 🥕个人主页:开敲🍉 🔥所属专栏:C语言🍓 🌼文章目录🌼 编译环境与运行环境 1. 翻译环境 2. 编译环境:预编译(预处理)编…

Mac上的Gatekeeper系统跟运行时保护

文章目录 问题:无法打开“xxx.xxx”,因为无法验证开发者。macOS无法验证此App是否包含恶意软件。如何解决? 参考资料门禁运行时保护 问题:无法打开“xxx.xxx”,因为无法验证开发者。macOS无法验证此App是否包含恶意软件…

解析SpringBoot自动装配原理前置知识:解析条件注释的原理

什么是自动装配? Spring提供了向Bean中自动注入依赖的这个功能,这个过程就是自动装配。 SpringBoot的自动装配原理基于大量的条件注解ConditionalOnXXX,因此要先来了解一下条件注解相关的源码。 以ConditionalOnClass为例 首先来查看Conditi…

兼顾陪读|本科学历律师自费赴美国加州大学伯克利分校访学

S律师拟陪同孩子赴海外就读,决定以访问学者身份,申请美国J类签证出国以兼顾陪读。因本科学历,无文章且有地域要求,自己申请无果后做了全权委托。为此我们酌情制定了三条申请策略,最终落实加州大学伯克利分校的访学职位…

NSString有哪些创建对象的方法?创建的对象分别存储在什么区域?

NSString有哪些创建对象的方法?创建的对象分别存储在什么区域? 一般通过NSString创建对象的方法有: NSString *string1 "123";NSString *string2 [[NSString alloc] initWithString:"123"];NSString *string3 [NSSt…

解决方案:如何安装neo4j软件

文章目录 一、安装JDK二、安装neo4j 一、安装JDK 第一步先安装JDK,因为neo4j环境需要JDK,过程比较多,截图如下: 安装JDK网址 https://www.oracle.com/java/technologies/downloads winR,输入cmd,再输入j…

Leetcode70. 爬楼梯(动态规划)

Leetcode原题 Leetcode70. 爬楼梯 标签 记忆化搜索 | 数学 | 动态规划 题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?示例 1:输入:n 2 输出:2 解…

数据分析之POWER Piovt透视表分析与KPI设置

将几个数据表之间进行关联 生成数据透视表 超级透视表这里的字段包含子字段 这三个月份在前面的解决办法 1.选中这三个月份,鼠标可移动的时候移动到后面 2.在原数据进行修改 添加列获取月份,借助month的函数双击日期 选择月份这列----按列排序-----选择月…