次のように、データベースに 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
、それともその逆でしょうか。
ベストアンサー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;