十年河东,十年河西,莫欺少年穷
本篇主旨是如何物理删除有主外键约束的记录!那么,我们从主外键走起!
下面新建三张有主外键约束的表,分别为:系/学院表,专业班表,学生表,如下:
CREATE TABLE Dept--系/学院表 ( DeptId int identity(1,1) primary key, DeptName nvarchar(50),--系名称 AddTime datetime default(getdate()) ) CREATE TABLE Grade--班级表 ( GradeId int identity(1,1) primary key, DeptId int FOREIGN KEY REFERENCES Dept(DeptId), GradeNum varchar(50) unique,--专业班编号 GradeName nvarchar(50),--专业名称 AddTime datetime default(getdate()) ) CREATE TABLE Student ( StudentId int identity(1,1) primary key, GradeId int FOREIGN KEY REFERENCES Grade(GradeId), StudentName nvarchar(50),--学生姓名 SudentSex nvarchar(1) default('男'), )
由上述SQL脚本,我们可以得到:学生表外键于班级表、班级表外键于系/学院表。也就是说:系和班级是1:N 的关系,同理班级和学生也是1:N 的关系。
上述的主外键很清晰!
下面我们新增记录,如下:
由上图,我们可以看出计算机系下,有计算机网络、计算机科学与技术两个专业班。计算机网络、计算机科学与技术两个班级均有两个学生!
现在我们有如下需求:
删除计算机系~
因为有外键约束,所以当我们删除时,会发现删除失败!
而这时我们要做的是:先删除学生表、再删除班级表、最后删除系/学院表。
有了以上思路,我们就可以写存储过程了!
存储过程如下:
create proc DeleteDeptProc ( @DeptId int, @IsSuccess bit=0 output ) as begin delete from [dbo].[Student] where GradeId in (select GradeId from [dbo].[Grade] where DeptId=@DeptId) delete from [dbo].[Grade] where DeptId=@DeptId delete from [dbo].[Dept] where DeptId=@DeptId set @IsSuccess=1 end --执行上述存储过程 DECLARE @DeptId int, @IsSuccess bit SET @DeptId = 1; exec DeleteDeptProc @DeptId,@IsSuccess
执行结果如下(输出参数可以在程序中判断执行是否成功~嘻嘻~):
从上图看出,可以一次性删除完成!
之所以采用存储过程是因为存储过程的特性:要么做,要么不做!这样就保证了数据的完整性!
当然,本节使用存储过程实现的,大家也可以采用SQL的触发器实现,使用触发器实现是基于级联删除!这个大家自行查询资料!
@陈卧龙的博客