1. ホーム
  2. sql

[解決済み] SQL ON DELETE CASCADE、削除はどちらで行われますか?

2022-04-27 13:33:48

質問

データベース内に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;

そうすると Course 属性で BookCourses リレーションは Code 属性は Courses リレーションを使用します。

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

どのように解決するのですか?

テーブル上の何かを削除すると、カスケードが動作します。 Courses . テーブル上の任意のレコード BookCourses テーブルを参照している Courses は自動的に削除されます。

しかし、テーブルを削除しようとすると BookCourses はテーブル自体にのみ影響し Courses

follow-up question: なぜ、あなたは CourseID のテーブルのCategoryにある?

スキーマをこのように再構築した方がいいかもしれませんね。

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;