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

从父记录中删除时,SQL Server会对所有子记录执行删除操作,sql,sql-server,visual-studio,Sql,Sql Server,Visual Studio,我有三张桌子: 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

我有三张桌子:

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

每一个都是一对多的关系。当我尝试从主题中删除时,我得到了一个外键约束,这很好。我想知道的是如何绕过这个问题,执行一个查询,以级联方式删除所有相关方面。我查了一下,发现有很多问题,但我不确定它是如何工作的,似乎有多个查询。是创建触发器更好,还是有一个基本的级联函数来完成这一切?我正在使用VisualStudio执行查询,但不确定执行类似任务的选项在哪里

这是您的
主题
表的DDL,其中包含用于删除的
级联
。这只是在你的FK中定义它的问题,但是使用。这是针对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
)
编辑-根据评论反馈在工作表上添加了
删除级联

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

使用此更新的定义,表
主题的删除也将删除表
主题中的子记录
以下是
主题
表的DDL,其中包含用于删除的
级联
。这只是在你的FK中定义它的问题,但是使用。这是针对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
)
编辑-根据评论反馈在工作表上添加了
删除级联

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

使用此更新的定义,表
主题上的删除也将删除表
主题中的子记录

您可以在外键定义之后添加删除级联上的

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

如果愿意,您还可以将其定义为单独的约束,可以在
创建表
语句中,或者使用
ALTER TABLE ADD constraint
在外键定义之后添加
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

将其定义为单独的约束,将其作为外键关系的一部分。这里有一个合理的解释:。您希望将删除级联
作为外键关系的一部分。这里有一个合理的解释:。我在主题和主题中都添加了一个on Delete级联,因为它不能只处理主题,但我得到了回报:Msg 547,16级,状态0,第116行Delete语句与引用约束“FK__工作表__主题__5A846E65”冲突。冲突发生在数据库“cosy”、表“dbo.sheet”和列“TopicID”中。该语句已终止。@ecribs-您必须在表关系中添加该语句。因此,如果有从主题到工作表的连续约束,则需要确保在其中定义的FK也标记为级联(如果这是预期行为)。我编辑了答案,还指定了一个从主题到工作表的
级联删除
。我向主题和主题都添加了一个on DELETE级联,因为它不只是处理主题,但我得到了这个结果:Msg 547,级别16,状态0,第116行DELETE语句与引用约束“FK_uu工作表_u主题_uu5a846e65”冲突。冲突发生在数据库“cosy”、表“dbo.sheet”和列“TopicID”中。该语句已终止。@ecribs-您必须在表关系中添加该语句。因此,如果有从主题到工作表的连续约束,则需要确保在其中定义的FK也标记为级联(如果这是预期行为)。我编辑了答案,还指定了从主题到工作表的
级联删除