`
高级java工程师
  • 浏览: 410473 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

级联删除和级联修改

阅读更多
曾经因为级联删除的问题浪费了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。
分享到:
评论

相关推荐

    hibernate many-to-many级联保存,级联更新,级联删除

    本文将深入探讨如何在Hibernate中处理Many-to-Many关系的级联保存、级联更新和级联删除。 一、Many-to-Many关系基础 在数据库设计中,Many-to-Many关系意味着两个实体之间存在多对多的关系。例如,学生可以选修多门...

    级联删除笔记【自用0分】

    级联删除和级联更新是数据库管理中非常重要的概念,特别是在多表关联的情况下,能够确保数据的一致性和完整性。本文将详细介绍如何在SQL Server中实现级联更新和级联删除,包括通过触发器的方式和使用外键约束的方式...

    SQL server创建触发器实现级联删除

    ### SQL Server 创建触发器实现级联删除 在数据库管理中,触发器是一种特殊类型的存储过程,它被设计为响应特定的事件(如插入、更新或删除数据)而自动执行。本文将详细介绍如何在 SQL Server 中创建一个触发器来...

    Oracle数据库中的级联查询、级联删除、级联更新操作教程

    Oracle数据库中的级联查询、级联删除和级联更新是数据库设计中常用的操作,它们用于在多表关联的关系型数据库中实现数据的联动处理。在Oracle中,这些操作主要涉及外键约束和触发器。 首先,级联查询是通过自连接来...

    JavaScript小案例:级联列表.html

    级联的操作有级联更新,级联删除。 二、级联相应的操作 在启用一个级联更新选项后,就可在存在相匹配的外键值的前提下更改一个主键值。系统会相应地更新所有匹配的外键值。如果在表A中将姓名为王五的记录改为李四,...

    Hibernate的级联操作(增,删,该)

    2. 级联删除(Cascade Type.REMOVE) 当设置为`CascadeType.REMOVE`时,如果删除了父实体,与之关联的子实体也会被删除。这在处理一对多或者多对多关系时非常有用,可以确保相关的数据在数据库中得到一致性的清理。...

    解析Oracle中多表级联删除的方法

    如果在创建表时未设置级联删除,可以后续通过修改表结构来添加。这涉及删除原有的外键约束,然后重新创建带`ON DELETE CASCADE`的约束,例如: ```sql ALTER TABLE "U_WEN_BOOK"."GCHILTAB1" DROP CONSTRAINT "FK_...

    级联增删改查

    例如,在一对多或者多对多的关系中,如果删除了一个父记录,而这个父记录与多个子记录有关联,级联删除会确保所有子记录也被同时删除,避免了数据的不一致性和孤立的记录。 "INverse"属性则通常在ORM(对象关系映射...

    Java中单表和多表级联的增删改查

    - Hibernate等ORM框架提供了级联操作的支持,可以在实体类的配置中定义级联类型,如CascadeType.ALL(包含保存、更新、删除和加载)。 3. **单选按钮(Radio Button)**: - 在Java Swing或JavaFX中,单选按钮...

    js加html编写的级联菜单

    2. **DOM操作**:使用DOM(文档对象模型)API,JavaScript可以创建、修改或删除HTML元素,从而动态构建和更新菜单结构。 3. **数据获取**:通过Ajax(异步JavaScript和XML)技术,JavaScript可以向服务器发送请求,...

    实体Bean之间的级联关系

    4. `REMOVE`:当删除一个实体时,`REMOVE`会级联删除所有关联的实体。这在保持数据一致性时非常有用,避免了因忘记删除关联实体而导致的数据不一致。 5. `REFRESH`:刷新实体时,`REFRESH`会从数据库中获取最新的...

    二级级联菜单

    1. DOM操作:JavaScript通过Document Object Model (DOM)来操控网页元素,包括创建、修改和删除HTML元素。在级联菜单中,我们需要用到DOM API来获取、改变文本框的值和显示状态。 2. 事件监听:使用`...

    select级联

    在描述中提到的"动态元素级联",指的是通过JavaScript或者jQuery动态地改变HTML元素,包括创建、修改或删除元素,以实现级联效果。例如,当用户在第一个`select`中做出选择时,我们可以监听其`change`事件,然后根据...

    JavaScript动态级联下拉列表框

    要实现级联效果,我们需要获取或创建下拉列表(`<select>`元素),添加或删除选项(`<option>`元素),以及监听用户的选中事件。例如,可以使用`document.getElementById()`或`document.querySelector()`找到目标...

    sql数据库省市区表级联文件

    - **级联删除**:当删除父表中的一条记录时,自动删除所有子表中与此记录相关的所有记录。 ### 二、省市区表设计 #### 1. 表结构设计 在文件中,可以看到`province`、`city`和`area`三个表的设计。这些表的设计都...

    java级联菜单

    7. 动态级联菜单:如果你需要根据某些条件动态改变级联菜单,可以在运行时添加或删除 `JMenuItem`。注意,更改后可能需要重新布置菜单栏以确保正确显示。 8. 国际化支持:Java Swing 支持多语言环境,你可以通过...

    js级联插件

    这需要对DOM(Document Object Model)有深入的理解,以便动态地创建、修改和删除DOM元素。 在JavaScript中,级联插件的API设计可能包括以下部分: 1. 初始化:`$(selector).cascade(options)`,用于选择指定的DOM...

    三级级联菜单(JS+HTML)

    在JS中,我们通过DOM API来创建、查找、修改和删除HTML元素。 2. 事件监听:在JS中,我们需要为菜单项添加点击事件监听器,以便在用户点击时触发相应的动作,如展开或收起子菜单。常用的事件有`click`、`mouseover`...

    级联动态树

    数据库操作代码通常涉及SELECT、INSERT、UPDATE和DELETE语句,它们用于从数据库检索、插入、修改和删除数据。在级联动态树的应用中,这些语句可能需要递归地处理整个树结构,以确保所有相关节点的状态正确反映在...

    10_JPA详解_JPA中的一对多双向关联与级联操作.zip

    这有助于简化代码,但需要注意过度使用级联可能导致数据的意外修改。 **注意事项** 1. 双向关联可能会导致数据不一致,因此在处理关联时,需要确保在双方都进行同步更新。 2. 级联操作虽然方便,但可能引发性能问题...

Global site tag (gtag.js) - Google Analytics