从父记录中删除时,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也标记为级联(如果这是预期行为)。我编辑了答案,还指定了从主题到工作表的级联删除。