从父项删除时,SQL Server对所有子记录执行删除操作

时间:2016-03-05 12:45:13

标签: sql sql-server visual-studio

我有3张桌子:

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)
);

每个人都是一对多关系。当我尝试从Subjects中删除时,我得到一个外键约束,这很好。我想知道的是如何绕过这个并执行查询以删除级联样式中的所有相关方面。我查了一下,但是我不知道它是如何工作的似乎有多个查询。创建一个触发器还是有一个基本的级联功能可以做到这一点更好吗?我正在使用visual studio来执行查询,但不确定执行此类任务的选项在哪里?

2 个答案:

答案 0 :(得分: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中的子记录。

答案 1 :(得分: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将其定义为单独的约束。