SQL ON DELETE CASCADE、削除はどのように行われますか?


156

次のように、データベースに2つの関係がある場合:

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

そして、私はこのように2つの間に外部キー関係を確立します:

ALTER TABLE BookCourses
ADD FOREIGN KEY (Course)
REFERENCES Courses(Code)
ON DELETE CASCADE;

次にCourseBookCoursesリレーションのCode属性がリレーションの属性を参照していることがわかりますCourses

私の質問は、削除が2つの関係のどちらかで発生した場合、削除はどのようにカスケードされるのですか?Coursesリレーション内のタプルを削除すると、リレーション内のすべての参照タプルが削除さBookCoursesれますか、それともその逆ですか?


11
なぜ一つは、唯一の不思議Categories表がありCourseIDながら、主キーとしてCoursesテーブルを持っていますEntryID。あなたは真剣にあなたの名前の選択を再考する必要があります。
ypercubeᵀᴹ

7
混乱を避け、DB構造を明確にするために、適切な列名を使用してください。
Gunjan Shah 2013

回答:


185

カスケードは、テーブルで何かを削除するときに機能します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;

5
すごい!ありがとうございました。フォローアップの回答:私はずっと考えていたので、今修正済み...そして私のDB内
Oliver Spryn

59
この回答には、テーブルの名前と構造が質問とは異なります...あまり役に立たなくなります。
Daniel Beardsley

4
@DanielBeardsley、私はこの答えが役に立たないことに同意しません。それはあなたがそれが言うことを読んだ場合です。ただし、実際の回答の一部が何であり、別のディスカッションが何であるかが明確であるように、回答をフォーマットできることに同意します。上記で強調表示されているスキーマは、フォローアップの質問に関連していますが、実際の質問への回答には関連していません。
Baldur 2016年

26

これは、この古い投稿にアクセスしている他の人のための簡単な例ですが、質問の例と混同されています。

配送->パッケージ(1つ->多く)

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)の参照エンティティと共に削除されます。

そのため、配信が削除されると、それを参照しているパッケージも削除されます。パッケージが削除された場合、どの配信にも何も起こりません。


わかりやすい例をありがとう!
トムスペンサー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.