利用递归级联删除的代码

级联树状结构,删除的时候,需要一级一级查找,并一级级删除操作,如此反复操作,需要不断调用同一个函数,所以这里使用递归操作十分方便

递归函数需要单独书写,并在方法中调用。

以下示例代码,为一个级联删除,有个父id 然后不断查找其子id 并删除 通过子id 继续查找其id的子id 删除,由于多语句操作,所以使用了事物手动提交方式

(其中处理异常方式不严谨!!)

/**
     * 级联删除的递归函数
     * @param conn 调用者需要将其连接对象传入,方便事物操作
     * @param id 将删除的父id传入
     * @throws Exception
     */
    public void doDel(Connection conn,int id) throws Exception{

    	//查找id进行删除操作
    	String sql = "delete from address where id = ?";
		PreparedStatement ps = conn.prepareStatement(sql);
		ps.setInt(1, id);
		ps.executeUpdate();

		//将此id作为父id查找其子id(级联子)
    	sql = "select id from address where parentId = ?";
		ps = conn.prepareStatement(sql);
		ps.setInt(1, id);
		ResultSet rs = ps.executeQuery();
		//此条件没有数据时可结束递归,然后不断跳出,结束循环
		while(rs.next()){
			//这里通过传入其子ID 再不断查找其子孙id进行删除和查询删除往复操作
			this.doDel(conn,rs.getInt("id"));
		}
		//rs ps每次递归函数调用时新创建,所以用完关闭
		//对于Connection是调用函数传入,不能关闭,要使用此连接提交和回滚事务
		rs.close();
		ps.close();
    }
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setContentType("text/html;charset=utf-8");
		response.setCharacterEncoding("utf-8");
		ProxyDAO proxy = new ProxyDAO();
		int id = Integer.parseInt(request.getParameter("Id"));
		Connection conn = proxy.getConn();
		try{
			//这里由于是多语句操作,考虑异常问题,需要设置手动提交
			conn.setAutoCommit(false);
			//调用递归函数,并传入当前连接与当前id
			this.doDel(conn, id);
			//如果正常运行无异常,此方法会被调用,提交事务
			conn.commit();
		}catch(Exception ex){
			try {
				//如果出现异常,事物回滚
				conn.rollback();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			ex.printStackTrace();
		}
			//业务处理完毕,进行其他操作.....

	}

  

时间: 2024-10-16 13:13:27

利用递归级联删除的代码的相关文章

php学习笔记:利用递归实现删除文件目录

直接删除目录,如果是空目录是可以删除,如果不是空目录,这时候只能先删除目录里面的文件,然后再删除目录.我封装了个删除函数,然后直接调用这个函数.喜欢的可以直接拿去用,编码是gbk的,使用时候注意下编码. <?php /** * Created by PhpStorm. * User: Administrator * Date: 2016/9/10 0010 * Time: 20:27 */ //删除文件,先删除文件内部的文件,再删除文件夹 header("Content-type: tex

[原创]MYSQL中利用外键实现级联删除和更新

MySQL中利用外键实现级联删除.更新 MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定在删除.更新父表时,对子表进行的相应操作,包括RESTRICT.NO ACTION.SET NULL和CASCADE.其中RESTRICT和NO ACTION相同,是指在子表有关联记录的情况下父表不能更新:CASCADE表示父表在更新或者删除时,更新或者删除子表对应记录:SET NULL则是表示父表

MySQL中利用外键实现级联删除、更新

MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定在删除.更新父表时,对子表进行的相应操作,包括RESTRICT.NO ACTION.SET NULL和CASCADE.其中RESTRICT和NO ACTION相同,是指在子表有关联记录的情况下父表不能更新:CASCADE表示父表在更新或者删除时,更新或者删除子表对应记录:SET NULL则是表示父表在更新或者删除的时候,子表的对应字段被S

【Python】Django数据模型、级联删除、级联更新、ER图导出等

在本文中,我们将向读者详细介绍如何在更新和删除父表数据的同时,触发有关子表数据的级联更新和删除操作.您将看到当使用InnoDB表的时候,借助于外键约束就可以轻松搞定这一过程. 一.利用外键约束更新并删除MySQL中的数据 我们知道,开发能够维护多个表的完整性的数据库驱动的应用程序是一件非常复杂的事情--即使应用程序所面对的是当前最流行的开源关系型数据库管理系统MySQL服务器时也不例外.如果一个应用程序必须处理多个数据库表,而这些表之间有存在着某些预定义的关系,这时一旦父表中的数据被更新或者删除

聊聊数据库级联删除与伪删除的设计方案

背景: 这两天看了重温了下设计模式和数据结构,又补了下基础知识,然后就失眠了一整夜,不知为啥就想到级联及伪删数据这个问题. 由于级联删除是几乎人人都会遇到的问题,但方案却有限却不美好,所以欢迎大伙集思文益,以下内容欢迎大伙一起讨论. 级联删除的方式: 方式1:数据库设定级联: 常规MSSQL.MySql.Oracle都对设定了主外键关系的表提供级联删除. 优点:数据准确.使用方便,数据库设计之初就设定好. 缺点: 1:增加对增删改时外键检测的额外开销. 2:潜在危险系素大(如:删除部门或角色,发

关于数据的级联删除和更新

两张表:“ProductCategory”,“Product”. 有一个需求是这样的:在删除某个ProductCategory 的时候,同时删除该Category的products. 在MySQL中利用外键实现级联删除 创建以下测试用数据库表: CREATE TABLE `roottb` ( `id` INT(11) UNSIGNED AUTO_INCREMENT NOT NULL, `data` VARCHAR(100) NOT NULL DEFAULT '', PRIMARY KEY (`i

利用递归 实现UIScrollView无限滚动的效果

项目需求 利用递归 实现UIScrollView无限滚动的效果. 上机试题, #import "ViewController.h" @interface ViewController (){ UIScrollView *mainScroll; BOOL isFinish; int x; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; x=0; isFinish = YES;

级联删除

相信学过数据库基础的童鞋们都知道,当有两个表A和B,表A的外键正是表B的主键时,我们会发现,当我们用数据库语言对B表数据进行删除操作的时候,我们会发现根本就删除不了,所以呢,在实际代码中,想要通过点击删除就可以删除?那么就需要对其进行相关操作了,具体的呢,咱就一步一步来,我所写的是通过spring3+hibernate4+struts2+maven写的代码,里面有两个表department 和user,其department的主键did在user中作为外键,这时候就必然会在department.

利用jQuery如何删除一个节点

利用jQuery如何删除一个节点:添加或者删除节点是常用的操作,本章节介绍一下如何删除一个节点,当然在jQuery中删除节点的函数不止一个,不过这里就介绍一下如何使用remove()函数实现此功能,代码如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.soft