2016-03-05 89 views
0

刪除時,我有3個表:SQL Server中執行所有子記錄的刪除父

Create TABLE Subjects 
(
    SubjectID INT PRIMARY KEY NOT NULL IDENTITY(1,1), 
    SubjectName VARCHAR(20) NOT NULL, 
    ClassID VARCHAR(10) FOREIGN KEY REFERENCES Classes(ClassID) NOT NULL 
); 

Create TABLE Topic 
( 
    TopicID INT PRIMARY KEY NOT NULL IDENTITY(1,1), 
    TopicName VARCHAR(100), 
    SubjectID INT FOREIGN KEY REFERENCES Subjects(SubjectID) 
); 

Create Table Worksheet 
(
    WorksheetName varchar(100) PRIMARY KEY, 
    TopicID INT Foreign KEY References Topic(TopicID), 
    Num_Q INT NOT NULL, 
    W_Type varchar(30) 
); 

每一種是一對多的關係。當我嘗試從主題中刪除時,我得到了一個很好的外鍵約束。我想知道的是如何解決此問題並執行查詢以級聯樣式刪除所有相關方面。我查了一下,但還有,但我不確定它是如何工作的,似乎有多個查詢。創建一個觸發器還是有一個基本的級聯功能可以完成這一切?我使用visual studio來執行查詢,但不知道執行此類任務的選項在哪裏?

+0

你想'在刪除級聯'作爲外鍵關係的一部分。這是一個合理的解釋:http://www.techonthenet.com/sql_server/foreign_keys/foreign_delete.php。 –

回答

1

您可以使用外鍵定義之後添加ON DELETE CASCADE

Create TABLE Subjects (
    SubjectID INT PRIMARY KEY NOT NULL IDENTITY(1, 1), 
    SubjectName VARCHAR(20) NOT NULL, 
    ClassID VARCHAR(10) NOT NULL 
     FOREIGN KEY REFERENCES Classes(ClassID) ON DELETE CASCADE 
); 

你也可以把它定義爲一個單獨的約束,如果你喜歡,無論是內CREATE TABLE語句或使用ALTER TABLE ADD CONSTRAINT

1

這是您的Topic表的DDL,其中CASCADE用於刪除。它只是在你的FK中定義它的問題,但使用a slightly different syntax。這是用於MS Sql Server的。

CREATE TABLE Topic 
( 
    TopicID INT PRIMARY KEY NOT NULL IDENTITY(1,1), 
    TopicName VARCHAR(100), 
    SubjectID INT, 
    CONSTRAINT FK_Subjects_Topic FOREIGN KEY (SubjectID) 
     REFERENCES Subjects (SubjectID) 
     ON DELETE CASCADE 
     ON UPDATE NO ACTION 
) 

編輯 - 基於評論反饋表上表添加DELETE CASCADE

Create Table Worksheet 
(
    WorksheetName varchar(100) PRIMARY KEY, 
    TopicID INT, 
    Num_Q INT NOT NULL, 
    W_Type varchar(30), 
    CONSTRAINT FK_Topic_Worksheet FOREIGN KEY (TopicID) 
     REFERENCES Topic (TopicID) 
     ON DELETE CASCADE 
     ON UPDATE NO ACTION 
); 

有了這個更新定義中刪除表Subjects也將在表Topics刪除子記錄。

+0

我在刪除級聯上添加了一個主題和主題,因爲它不是隻與主題一起工作,但是我得到了這一點:消息547,級別16,狀態0,行116 DELETE語句與REFERENCE約束衝突「 FK__Worksheet__Topic__5A846E65" 。衝突發生在數據庫「愜意」,表「dbo.Worksheet」,列'TopicID'。 該聲明已被終止。 – ecribs

+0

@ecribs - 你必須在你的餐桌關係中添加這個。因此,如果您有從主題到工作表的約束繼續下去,那麼您需要確保在那裏定義的FK也標記爲級聯(如果這是預期的行爲)。我編輯了答案,還指定了從主題到工作表的「CASCADE DELETE」。 – Igor