--我们就以院系,班级,学生来举例。 create TABLE [dbo].YuanXi ( Id int IDENTITY(1,1) NOT NULL,--学校id 自增量 YuanXiName varchar(50) null, --院系名字 ) create TABLE [dbo].Class ( Id int IDENTITY(1,1) NOT NULL,--班级id 自增量 YuanXiID int null,--院系id ClassName varchar(50) null --班级名字 ) create TABLE [dbo].Student ( Id int IDENTITY(1,1) NOT NULL,--学生id 自增量 ClassID int null,--班级id StudentName varchar(50) null,--学生姓名 ) --这个表是图片表,我临时加的,后面可能用这个演示 create TABLE [dbo].PathImg ( Id int IDENTITY(1,1) NOT NULL,--学校id 自增量 TableName varchar(50) null, --这个是表明,比如我要在信息工程学院价格图片,那就要在改表中把XuanXi表的表名子加上,还有信息工程学院的id加上 TableNameId int null,--这个就是某一个表中的某一个id Path varchar(50) null, --存放班级照片路径的 )
其实删和插入操作差不多。
我们就简单的说常用且简单的删除:
1,删除表中所有数据:
delete from YuanXi where 1=1
2,根据条件删除表中某些数据
delete from YuanXi where YuanXiName=传入的参数
接下来,就是涉及多表数据删除的问题了。注意:在实际开发中在执行删除操作的时候,一定要遵循一个原则,不要留尾巴,也就是在删除某一条数据的时候,一定要把和这条数据所有有牵扯并且不影响其他数据的数据全部删除,如果不这样做,其他表中会留有残余,也就是数据垃圾,不利于后续项目的维护。所以,在执行删除操作的时候,往往你要删除一条数据,大多都会牵扯的几个表的数据删除。
这里我也要说一下,删除的时候也要考虑级别, 就以上面四个表为例:如果我要删除YuanXi表中的信息工程学院,那么我就把和信息工程学院有关的所有数据都要删除,班级表中的信息工程学院的班级,Student表中班级下的所有学生,还有通用图片表格中以上三个表中所有数据图片路径都删除。但是如果我要删除Class表中多媒体,这时,我就不能删除YuanXi表中信息工程学院了,如果我要删除信息工程学院那么,Class表中计算机科学与技术就会变得无用了。这样就会出现数据错误,影响平台的正常显示了。这时你只能删除,学生表中在信息工程学院下的所有学生,和通用图片表中的关于班级图片路径和学生图片路径。
下面我就演示一下删除学院,也是最多表的删除数据的操作了,当然是针对上面四个表来说的:
@YuanXiID:传入的yuanXI表中的Id参数,下面写存储过程要用,所以上面直接写成这个形式了。
--//第一步:
delete from YuanXi where Id=@YuanXiID--先删除院系
delete fom PathImg where TableName='YuanXi' and TableNameID=@YuanXiID --删除通用图片表中图片路径
--//第二步:注意:这里如果你直接删除Class表中的数据,那Student表中的数据就没法删除了,因为与Student表中关联的Class中的Id已经被删除,所以这时候应该这样做
//先删除与班级关联的Sudent表中学生和PathImg图片路径
这里要逆序删除,不然会出现找不到关联表Id的情况了。
先在PathImg表中删除关于学生的图片路径id
delete from PathImg where TableName=’Student' and Id in(select Id from Student where Id in(select Id from Class where YuanXiID=@YuanXiID))
-- /(2)/删除Student表中学生Id
delete from Student where Id in(select Id from Class where YuanXiID=@YuanXiID)
-- //(3)删除Class表中班级Id
delete from Class where YuanXiID=@YuanXiID
--//(4)删除PathImg表中班级图片路径Id
delete from PathImg where TableName='Class' and TableNameID in (select Id from Class where YuanXiID=@YuanXiID)
--注意:(1)和(2)必须要在(3)和(4)的前面执行,(1)必须要在(2)前面执行。这样才能把数据删除干净。
整理一下,写个存储过程:(注意删除数据的时候,一般传的参数都是表中的自增id列,这个参数是唯一确定的)
USE [TestData] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[deleteYuanXi] @YuanXiID int --表示YUanXi表中的Id列的参数变量 AS delete from YuanXi where Id=@YuanXiID--先删除院系 delete from PathImg where TableName='YuanXi' and TableNameID=@YuanXiID --删除通用图片表中图片路径 delete from PathImg where TableName=’Student' and Id in(select Id from Student where Id in(select Id from Class where YuanXiID=@YuanXiID))--删除PathImg表中学生图片路径 delete from Student where Id in(select Id from Class where YuanXiID=@YuanXiID)--删除Student表中学生Id delete from Class where YuanXiID=@YuanXiID--删除Class表中班级Id delete from PathImg where TableName='Class' and TableNameID in (select Id from Class where YuanXiID=@YuanXiID)--删除PathImg表中班级图片路径
现在看来,删除操作并不像我们想的那么简单了。
想学好数据库,当然任何事都一样,理论知识固然重要,但是实践更重要,可能对一些人来说,将起理论知识来,头头是道,但是让他操作那就是另一回事了。像我在公司刚接触这些存储过程的时候,一脸懵逼,因为他就像写后台代码一样,好多存储过程都好几百行,看的我都想哭。我也没学什么理论知识,遇到不会的就百度一下,日积月累,我写sql代码也像我写后台代码一样了,只是,知道这样做是对的,但是不知道具体理论,包括数据库的逻辑代码效率优化,也是只知道如何改进执行效率会更高,至于什么原因就一知半解了。真是应了老邓的那句话了 ’实践是检验真理的唯一标准!‘