2012-11-18 14 views
122

私はこのようなデータベースでは2人の関係、お持ちの場合:DELETE CASCADEのSQLでは、削除はどのように行われますか?

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; 

が次にあなたが見ることができるCourse属性BookCoursesの関係は、Coursesの関係のCode属性を参照します。

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

ありがとうございます。

+7

一つが唯一の不思議。あなたは真剣にあなたの命名の選択肢を考え直す必要があります。 –

+4

混乱を避け、DB構造をクリアするため、適切なカラム名を付けてください。 –

答えて

152

テーブルCoursesで何かを削除するとカスケードが機能します。テーブルCoursesへの参照を持つテーブルBookCoursesのレコードも削除されます。なぜあなたは、テーブルカテゴリにCourseIDを持っています:

しかし、あなたがテーブルの上にBookCoursesのみテーブル自体を削除しようCourses

フォローアップの質問に影響されていませんか?

たぶん、あなたはこのにあなたのスキーマを再構築すべきである `Courses`テーブルは` EntryID`を有している `Categories`テーブルは主キーとして` 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 * –

+51

この回答は、質問とは異なるテーブル名と構造を持っています。 –

+0

動作していません... – user3177068

関連する問題