关于级联删除和级联修改

2024-05-09 14:48
文章标签 级联 删除 修改

本文主要是介绍关于级联删除和级联修改,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

曾经因为级联删除的问题浪费了N多时间,顾此在这里写下小小心得,供大家借鉴。
  在数据库分别建立表t_food(菜单)和表t_book(订单),如下所示:
  t_food:
————————————————————————————
  food_id (主键)       food_name          food_price
  1                                        苹果                       2.4
  2                                    香蕉                       3.5
  ……
————————————————————————————
  t_book:
————————————————————————————
  id                  foodid(外键)                  num
  1                      1                                          5
  2                      2                              4
  ……
————————————————————————————
  如果你想删除t_food中的某一行数据,就有可能会出现如下错误:
java.sql.SQLException: Cannot delete or update a parent row: a foreign key constraint fails (`shopcar2`.`t_book`, CONSTRAINT `b_fid_o_fid` FOREIGN KEY (`foodid`) REFERENCES `t_food` (`food_id`))
 at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2921)
 at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1570)
 at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1665)
 at com.mysql.jdbc.Connection.execSQL(Connection.java:2972)
 at com.mysql.jdbc.Connection.execSQL(Connection.java:2902)
 at com.mysql.jdbc.Statement.executeUpdate(Statement.java:929)
 at org.apache.jsp.MyJsp_jsp._jspService(MyJsp_jsp.java:91)
 at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
 at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:389)
 at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:319)
 at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:270)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:191)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:227)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:211)
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:817)
 at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:623)
 at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:444)
 at java.lang.Thread.run(Thread.java:619)
  为什么会出现这样的问题呢?那是因为你所删除的数据表t_food中包含了主键food_id,如果直接删除数据,那么,
food_id对应的外键foodid就没有被指向,自然就会出现这种错误。
  那么,如何解决这个问题呢?有两种方法:
  第一种,也是最直接的,那就是在删除t_food的数据行之前,先将其所对应的t_book中的数据行删除。如你想删除
t_food中food_id=1所对应的数据行,那么,你可以先删除t_book中foodid=1对应的数据行,然后再删除t_food中
food_id=1所对应的数据行。
  第二种,在建立数据库时,设置主外键on delete cascade。这样,在删除主键对应数据时,外键对应的数据也会
被删除。
  此外,还有级联修改,它跟级联删除一样会出现以上问题,解决方法相似。建立数据库时,设置主外键on
update  cascade。

这篇关于关于级联删除和级联修改的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/973684

相关文章

MySql删除重复数据只保留最小id的那条数据。某某公司的临时面试题

错误代码: DELETE FROMpayment WHEREserial IN ( SELECT serial FROM payment GROUP BY serial HAVING count(*) > 1 ) AND id NOT IN ( SELECT min( id ) AS id FROM payment GROUP BY serial HAVING count( serial )

STM32 标准库3.5修改默认外部8M晶振为16M晶振

ST官方标准库V3.5默认的外部晶振频率为8M,实际使用中外部晶振需要修改为16M; 经过实验,修改有效,具体的patch如下: 修改 HSE_VALUE 值 diff --git "a/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/stm32f10x.h" "b/Libraries/CMSIS/CM3/DeviceSupport/ST/STM

Linux删除大文件rm -rf的问题

请几天,我删除系统汇总的大文件,大约100G左右,当我使用rm -rf  xxxx.log删除后,使用df -h发现空间并未释放。 一开始以为是由于磁盘虚拟挂载,导致我删除的文件并不是当前目录的文件。但后来发现并不是。 我在网络上搜索发现都是  要: lsof | grep delete kill -9 xxx 但是我觉得这样不安全。 比如文件被进程锁定,或者有进程一直在向这个文件写数

Altium Designer 修改titleblock

1)在AD中,找到template,例如A3。复制一份,原版命名为A3_old。 2)修改A3中的titleblock,按自己的喜好定义。 例如, title框定义为 “Title: =DocumentName” Revision框定义为“Revision: =zzrev” Docnum框定义为“DocNum: =zzdocnum” Date框不变,稍微调整一下TEXT的位置, Sheet框不变

代码随想录算法训练营第五十五天| 583. 两个字符串的删除操作 ,72. 编辑距离

目录 题目链接: 583. 两个字符串的删除操作 思路 代码 题目链接: 72. 编辑距离 思路 代码 总结 题目链接:583. 两个字符串的删除操作 思路         ①dp数组,dp[i][j]表示下标以i-1结尾的word1和下标以j-1结尾的word2若要相等,所需删除元素的最小次数         ②递归公式,当word1[i-1] == word2

ChannelSftp.put后流不关闭? ChannelSftp.put资源被占用?图片删除失败、图片删除被占用

文章目录 一、问题描述二、问题原因及解决方法 一、问题描述 在一次项目需求中需要将原图片下载到本地后旋转90度再上传到服务器上。但是在这个过程中代码抛错了。 代码步骤及部分逻辑如下: 1.下载原文件 2.生成一个新文件 File newFile = new File("aa.jpg");3.图片旋转,并将旋转后的内容写入到新图片中4.图片上传到服务器中public v

【算法刷题day55】Leetcode:583. 两个字符串的删除操作、72. 编辑距离

文章目录 Leetcode 583. 两个字符串的删除操作解题思路代码总结 Leetcode 72. 编辑距离解题思路代码总结 草稿图网站 java的Deque Leetcode 583. 两个字符串的删除操作 题目:583. 两个字符串的删除操作 解析:代码随想录解析 解题思路 dp数组的含义是,从word1从0到i-1,word2从0到j-1匹配上最少需要删除

如何修改照片的dpi值?在线图片更改dpi快捷方法

不少小伙不知道如何去改变图片分辨率,因为能用的到分辨率dpi的地方也不多,但是当我们在求职、考公或者是打印照片的时候,就经常看到会要求图片分辨率为300dpi以上了,本文将分享一款图片处理工具,它能快速完成修改图片分辨率,而且不用下载安装,打开就能使用,非常方便,一起来了解一下吧。 打开压缩图网站,点击“图片PDI修改”上传图片。 选择修改DPI的数值,点击开始生成。

hibernate 多对一级联删除;

// 删除元素     public String deleteAdvertisement() {         DetachedCriteria dc = DetachedCriteria.forClass(Advertisement.class);         if (this.id > 0) {             try {                 t