我有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来执行查询,但不确定执行此类任务的选项在哪里?
答案 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
将其定义为单独的约束。