当要删除有关系的几张表时,只删除其中的一张会出现严重的错误。因为几个表的数据是通过外键联系起来的,当删除主键表中的数据时,应该一起将子表对应的数据也删除。否则会引起混乱。
下面介绍一下方法(子查询)。
先看三张有关系的表
其中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进行处理
分享到:
相关推荐
(3)顺序表的运算有查找、插入、删除3种。 1.3 栈 1. 栈的基本概念 栈(stack)是一种特殊的线性表,是限定只在一端进行插入与删除的线性表。 在栈中,一端是封闭的,既不允许进行插入元素,也不允许删除元素;另...
1关系模型三个组成部分 基本关系(基本表、基表)查询表、视图表 2 关系模型常用的关系操作包括哪些,5种基本操作 查询:选择、投影、连接、除、并、差、交、笛卡尔积 数据更新:插入、删除、修改 选择、投影、并、...
实例142 新建有返回值的线程 184 实例143 使用线程池优化多线程编程 186 实例144 Object类中线程相关的方法 187 实例145 哲学家就餐问题 189 实例146 使用信号量实现线程同步 190 实例147 使用原子变量实现线程同步 ...
2、 定义一个为修改职工表(emp)中某职工工资的存储过程子程序,职工名作为形参,若该职工名在职工表中查找不到,就在屏幕上提示“查无此人”然后结束子程序的执行;否则若工种为MANAGER的,则工资加$1000;工种为...
简单来说是本身可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增、截取、更新、删除等操作。 常见的数据模型 1. 层次结构模型: 层次结构模型实质上是一种有根结点的定向有序树,IMS...
如果删除的表有外键, 删除的速度类似于delete。但新版本的MySQL中truncate的速度比delete速度快。 Ø 约束 MySQL中约束保存在information_schema数据库的table_constraints中,可以通过该表查询约束信息; 约束主要...
SQL Server 数据库设计 一、数据库设计的必要性 在实际的软件项目中,如果系统中需要存储的数据量比较大,需要设计的表比较多,表 与表之间的关系比较复杂,那我们就需要进行规范的数据库设置。如果不经过数据库的 ...
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';...
10、说明:两张关联表,删除主表中已经在副表中没有的信息 delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) 11、说明:四表联查问题: select * from a left ...
10、说明:两张关联表,删除主表中已经在副表中没有的信息 delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) 11、说明:四表联查问题: select * from a left ...
10、说明:两张关联表,删除主表中已经在副表中没有的信息 delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) 11、说明:四表联查问题: select * from a left ...
图1(5) 多张工作表中输入相同的内容几个工作表中同一位置填入同一数据时,可以选中一张工作表,然后按住Ctrl键,再单击窗口左下角的Sheet1、Sheet2......来直接选择需要输入相同内容的多个工作表,接着在其中的...
SessionStorage 存储的数据只在会话期间有效,关闭浏览器则自动删除 Sqlite 一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中 W3C 万维网联盟,创建于1994年,是Web技术领域最具权威...
将需要加密的一行文字输入加密程序,程序根据加密表中的对应关系,可以简单地将输入的文字加密输出,对于表中未出现的字符则不加密。 运行示例: 输入:lajgdike,w 输出:ldjg,abice (12)编写程序验证以下说法:...