SQL ON DELETE CASCADE,删除是通过哪种方式发生的?
Posted
技术标签:
【中文标题】SQL ON DELETE CASCADE,删除是通过哪种方式发生的?【英文标题】:SQL ON DELETE CASCADE, Which Way Does the Deletion Occur? 【发布时间】:2012-11-06 20:19:49 【问题描述】:如果我在数据库中有两个关系,像这样:
CREATE TABLE Courses (
CourseID int NOT NULL PRIMARY KEY,
Course VARCHAR(63) NOT NULL UNIQUE,
Code CHAR(4) NOT NULL UNIQUE
);
CREATE TABLE BookCourses (
EntryID int NOT NULL PRIMARY KEY,
BookID int NOT NULL,
Course CHAR(4) NOT NULL,
CourseNum CHAR(3) NOT NULL,
CourseSec CHAR(1) NOT NULL
);
我在两者之间建立了外键关系,如下所示:
ALTER TABLE BookCourses
ADD FOREIGN KEY (Course)
REFERENCES Courses(Code)
ON DELETE CASCADE;
然后可以看到BookCourses
关系中的Course
属性引用了Courses
关系中的Code
属性。
我的问题是当两个关系中的任何一个发生删除时,删除会以哪种方式级联?如果我删除Courses
关系中的元组,它会删除BookCourses
关系中的所有引用元组,还是相反?
【问题讨论】:
人们只是想知道为什么Categories
表有一个CourseID
作为主键,而Courses
表有EntryID
。你真的需要重新考虑你的命名选择。
请使用正确的列名以避免混淆和清晰的数据库结构。
【参考方案1】:
当您删除表 Courses
上的某些内容时,级联将起作用。表BookCourses
上任何引用表Courses
的记录都会被自动删除。
但是当您尝试删除表 BookCourses
时,只有表本身受到影响,Courses
上没有影响
后续问题:为什么表格类别中有CourseID
?
也许你应该把你的架构重组成这样,
CREATE TABLE Categories
(
Code CHAR(4) NOT NULL PRIMARY KEY,
CategoryName VARCHAR(63) NOT NULL UNIQUE
);
CREATE TABLE Courses
(
CourseID INT NOT NULL PRIMARY KEY,
BookID INT NOT NULL,
CatCode CHAR(4) NOT NULL,
CourseNum CHAR(3) NOT NULL,
CourseSec CHAR(1) NOT NULL,
);
ALTER TABLE Courses
ADD FOREIGN KEY (CatCode)
REFERENCES Categories(Code)
ON DELETE CASCADE;
【讨论】:
这个答案的表名和结构与问题不同......使它的用处大大降低。 @DanielBeardsley,我不同意这个答案没有用。也就是说,如果您阅读它所说的内容。我同意,但是同意答案可以被格式化,这样就很清楚实际答案的一部分是什么,另一个讨论是什么。上面突出显示的架构与后续问题有关,但与实际问题的答案无关。【参考方案2】:这是其他访问此旧帖子的其他人的简单示例,但对问题中的示例和其他答案感到困惑:
交付 -> 包裹(一个 -> 多个)
CREATE TABLE Delivery(
Id INT IDENTITY PRIMARY KEY,
NoteNumber NVARCHAR(255) NOT NULL
)
CREATE TABLE Package(
Id INT IDENTITY PRIMARY KEY,
Status INT NOT NULL DEFAULT 0,
Delivery_Id INT NOT NULL,
CONSTRAINT FK_Package_Delivery_Id FOREIGN KEY (Delivery_Id) REFERENCES Delivery (Id) ON DELETE CASCADE
)
外键Delivery_Id(Package)的条目与FK关系(Delivery)中的引用实体一起删除。
因此,当一个 Delivery 被删除时,引用它的 Packages 也将被删除。如果一个包被删除,任何交付都不会发生任何事情。
【讨论】:
以上是关于SQL ON DELETE CASCADE,删除是通过哪种方式发生的?的主要内容,如果未能解决你的问题,请参考以下文章