`

如何利用存储过程删除有关系的几张表

阅读更多

 

      当要删除有关系的几张表时,只删除其中的一张会出现严重的错误。因为几个表的数据是通过外键联系起来的,当删除主键表中的数据时,应该一起将子表对应的数据也删除。否则会引起混乱。

下面介绍一下方法(子查询)。

先看三张有关系的表

 

其中Modules表是Projects表的子表,TestDemands是Modules的子表

若要删除主表Projects表中的数据,必须将对应的Modules表和TestDemands表中的数据删除,而且要按从下至上的顺序

存储过程如下

 

--删除模块表
CREATE PROCEDURE dbo.TestManager_DeleteProject_Combination
       @ProjectID int
 
 AS
--删除测试需求表
DELETE
FROM
       dbo.Module_TestManager_TestDemands
WHERE
       dbo.Module_TestManager_TestDemands.MID
       IN
       (SELECT
              dbo.Module_TestManager_Modules.MID
       FROM
              dbo.Module_TestManager_Modules
       WHERE
              dbo.Module_TestManager_Modules.ProjectID
              IN
              (SELECT dbo.Module_TestManager_Projects.ProjectID
              FROM
                     dbo.Module_TestManager_Projects
              WHERE
                     dbo.Module_TestManager_Projects.ProjectID=@ProjectID))
--删除模块表
DELETE
FROM
       dbo.Module_TestManager_Modules
WHERE
       dbo.Module_TestManager_Modules.ProjectID=@ProjectID
      
--删除项目表
DELETE
FROM
       Module_TestManager_Projects
 
WHERE
       ProjectID=@ProjectID
 
GO
 

注:由于SELECT

              dbo.Module_TestManager_Modules.MID

       FROM

              dbo.Module_TestManager_Modules

       WHERE

              dbo.Module_TestManager_Modules.ProjectID

选出的是一张表,所以要用“IN”而不使用“=”。

 

 

我这里有一份解释比较清楚的删除过程

/*
 *@author : 小科学家
 *@since : 2010.01.06
 *@function:删除一个论坛版块
 */
ALTER PROCEDURE pro_Module_Delete
	(
	@moduleId int
	)
AS
	--说明如下:
	--删除版块先删除该版块下的所有贴子
	--删除帖子就要先删除该帖子下的所有回复帖子
	
	--删除所有回复帖子 ,注意在这里写sql语句的时候,最好从最后一层写起,这样能更好地避免出错
	delete from tb_revert where tb_revert.c_cardId   
	IN  
	(select tb_card.c_cardId from tb_card 
	where tb_card.m_moduleId 
	IN
	(select tb_module.m_moduleId from tb_module 
	where tb_module.m_moduleId = @moduleId))
	
	--删除完所有回复帖子,就可以删除版块下的帖子,同上面一样,只是少了一层而已
	delete from tb_card where tb_card.m_moduleId 
	IN
	(select tb_module.m_moduleId from tb_module 
	where tb_module.m_moduleId = @moduleId)
	
	--到了这里,终于可以直接删除版块了
	delete from tb_module where tb_module.m_moduleId = @moduleId
	
	--这个是删除与查询结合运用,在Java中可以用for循环做这样的操作
	--但sql里面是没有循环的。因此只能嵌套sql进行处理
 

 

 

 

 

0
0
分享到:
评论

相关推荐

    计算机二级公共基础知识

    (3)顺序表的运算有查找、插入、删除3种。 1.3 栈 1. 栈的基本概念 栈(stack)是一种特殊的线性表,是限定只在一端进行插入与删除的线性表。 在栈中,一端是封闭的,既不允许进行插入元素,也不允许删除元素;另...

    精心整理的数据库系统概论复习题.doc

    1关系模型三个组成部分 基本关系(基本表、基表)查询表、视图表 2 关系模型常用的关系操作包括哪些,5种基本操作 查询:选择、投影、连接、除、并、差、交、笛卡尔积 数据更新:插入、删除、修改 选择、投影、并、...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例142 新建有返回值的线程 184 实例143 使用线程池优化多线程编程 186 实例144 Object类中线程相关的方法 187 实例145 哲学家就餐问题 189 实例146 使用信号量实现线程同步 190 实例147 使用原子变量实现线程同步 ...

    oracle实验报告

    2、 定义一个为修改职工表(emp)中某职工工资的存储过程子程序,职工名作为形参,若该职工名在职工表中查找不到,就在屏幕上提示“查无此人”然后结束子程序的执行;否则若工种为MANAGER的,则工资加$1000;工种为...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    简单来说是本身可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增、截取、更新、删除等操作。 常见的数据模型 1. 层次结构模型: 层次结构模型实质上是一种有根结点的定向有序树,IMS...

    mysql数据库的基本操作语法

    如果删除的表有外键, 删除的速度类似于delete。但新版本的MySQL中truncate的速度比delete速度快。 Ø 约束 MySQL中约束保存在information_schema数据库的table_constraints中,可以通过该表查询约束信息; 约束主要...

    SQL数据库设计.doc

    SQL Server 数据库设计 一、数据库设计的必要性 在实际的软件项目中,如果系统中需要存储的数据量比较大,需要设计的表比较多,表 与表之间的关系比较复杂,那我们就需要进行规范的数据库设置。如果不经过数据库的 ...

    orcale常用命令

    8、存储函数和过程 查看函数和过程的状态 SQL>select object_name,status from user_objects where object_type='FUNCTION'; SQL>select object_name,status from user_objects where object_type='PROCEDURE';...

    数据库操作语句大全(sql)

    10、说明:两张关联表,删除主表中已经在副表中没有的信息 delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) 11、说明:四表联查问题: select * from a left ...

    经典SQL语句大全

    10、说明:两张关联表,删除主表中已经在副表中没有的信息 delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) 11、说明:四表联查问题: select * from a left ...

    sql经典语句一部分

    10、说明:两张关联表,删除主表中已经在副表中没有的信息 delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) 11、说明:四表联查问题: select * from a left ...

    excel的使用

    图1(5) 多张工作表中输入相同的内容几个工作表中同一位置填入同一数据时,可以选中一张工作表,然后按住Ctrl键,再单击窗口左下角的Sheet1、Sheet2......来直接选择需要输入相同内容的多个工作表,接着在其中的...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    SessionStorage 存储的数据只在会话期间有效,关闭浏览器则自动删除 Sqlite 一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中 W3C 万维网联盟,创建于1994年,是Web技术领域最具权威...

    上海电机学院C语言实训答案

    将需要加密的一行文字输入加密程序,程序根据加密表中的对应关系,可以简单地将输入的文字加密输出,对于表中未出现的字符则不加密。 运行示例: 输入:lajgdike,w 输出:ldjg,abice (12)编写程序验证以下说法:...

Global site tag (gtag.js) - Google Analytics