2016-03-05 67 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

相关问题