1. 程式人生 > >C# 如何物理刪除有主外鍵約束的記錄?存儲過程實現

C# 如何物理刪除有主外鍵約束的記錄?存儲過程實現

reference 走起 name tput 過程 我們 關系 編號 tid

十年河東,十年河西,莫欺少年窮

本篇主旨是如何物理刪除有主外鍵約束的記錄!那麽,我們從主外鍵走起!

下面新建三張有主外鍵約束的表,分別為:系/學院表,專業班表,學生表,如下:

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的觸發器實現,使用觸發器實現是基於級聯刪除!這個大家自行查詢資料!

@陳臥龍的博客

C# 如何物理刪除有主外鍵約束的記錄?存儲過程實現