当要删除有关系的几张表时,只删除其中的一张会出现严重的错误。因为几个表的数据是通过外键联系起来的,当删除主键表中的数据时,应该一起将子表对应的数据也删除。否则会引起混乱。
下面介绍一下方法(子查询)。
先看三张有关系的表
其中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进行处理
分享到:
相关推荐
2. **复杂操作的简化**:对于涉及多个表的更新、插入、查询和删除等操作,可以封装到存储过程中,便于管理和执行,同时可以与数据库的事务处理机制结合,确保数据一致性。 3. **代码复用**:存储过程可以被多次调用...
BSEG与其他几个子表——BSIS、BSAS、BSID、BSAD、BSIK和BSAK之间的关系是构成完整的财务凭证处理和清账流程的关键。 1. **BSAS与BSIS**: - **BSAS(已清总账明细)**:这张表用于存储已经清账的总账行项目信息。...
- **数据访问策略**:避免频繁访问同一张或几张大表,可以先将数据加载到临时表,然后在临时表上进行操作。 - **游标使用**:游标效率较低,应尽量避免,尤其是处理大量数据时。若必须使用,避免在循环中进行表...
例如,在"IT产品"数据库中,可能有product、Pc、Laptop和Printer等表,每张表都有其特定的模式定义,如product表可能包含产品ID、产品名称、价格等字段。 3. **表的创建**:在实验中,学生需要为每个数据库创建相应...
在IT行业中,数据库是存储和管理数据的核心工具,而数据库表结构则是数据组织的基础。有时候,我们可能需要对比两个数据库的表结构差异,比如在升级系统、迁移数据或进行数据库同步时。本篇将深入探讨如何自动对比两...
通过这个工具,你可以创建、修改和删除数据库、表、视图以及存储过程,而无需编写复杂的SQL语句。对于初学者来说,这是非常友好的,而对于经验丰富的开发者,它也提供了足够的灵活性和自定义选项。 在描述中提到的...
关系**: 一张二维表就是一个关系,是域的笛卡尔积的子集。关系的每一项都是不可分割的数据单元。 **2. 属性**: 表中的一列称为一个属性,每列有一个属性名。 **3. 域**: 属性的取值范围,即该属性可能取到的所有...
2. **表的操作**:数据库实例中包含了几张表,这可能是学生成绩管理系统的一部分。学习如何创建、修改和删除表是理解数据库结构的关键。CREATE TABLE语句用于新建表,ALTER TABLE用于修改已有表的结构,而DROP TABLE...
在关系型数据库中,数据以表的形式存在,每张表由列(字段)和行(记录)组成。它是一种支持关系模型的数据库,可以有效地描述和存储关系数据、进行数据操作,并维护数据的正确性和完整性。 关系模型、规范化 关系...
存储过程是一些预编译的 SQL 语句,更加直白的理解是:存储过程可以说是一个记录集,它是由一些 T-SQL 语句代码块组成的,这些 T-SQL 语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个...
- **存储过程**: 存储过程是预编译的一组SQL语句,可以接受输入参数并返回输出结果。它能提高代码的重用性和执行效率,同时还能增强数据的安全性。 - **触发器**: 触发器是一种特殊类型的存储过程,当特定的事件(如...
本篇文章将详细介绍Oracle 11g R2中的几个核心概念:数据库、数据表、记录、字段,以及如何进行数据表的基本操作如创建(create)、修改(alter)和删除(drop)。 #### 二、数据库(Database) 数据库(Database)是一组...
1. **存储过程**:存储过程是SQL Server中预编译的T-SQL语句集合,可以有输入参数,有返回值,并通过其名称来执行。在题目中提到的选项中,D选项描述正确。 2. **约束实现**:在教师表中,如果基本工资的取值与教师...
数据库是存储数据的容器,表是存储数据的基本结构,视图是基于表的查询结果集,存储过程是一组为了完成特定功能的SQL语句集,函数类似于存储过程,但必须返回一个值,触发器是数据库表中发生特定事件时自动执行的...
当前文档未提及具体的存储过程和触发器设计,但根据实际需求,可以考虑以下几种常见的存储过程和触发器: - **存储过程**: - `Proc_voucherInsert`:用于插入新的凭证记录。 - `Proc_accountUpdate`:更新账簿...
8. **存储过程(Stored Procedure)**:预编译的SQL语句集合,可多次重用,提升效率。 9. **触发器(Trigger)**:在特定事件发生时自动执行的程序,用于实现复杂的业务逻辑。 10. **数据库关系图(Database ...
(3)顺序表的运算有查找、插入、删除3种。 1.3 栈 1. 栈的基本概念 栈(stack)是一种特殊的线性表,是限定只在一端进行插入与删除的线性表。 在栈中,一端是封闭的,既不允许进行插入元素,也不允许删除元素;另...
关系数据库是基于关系模型的数据库,其核心特点是将所有数据组织成一张或多张二维表格,并且这些表格之间可以通过公共字段进行关联。关系数据库的优点在于结构清晰、易于理解和维护。 **1.3 常见的数据库对象** -...