2012-11-18 20 views
122

अगर मैं एक डेटाबेस में दो संबंधों, इस तरह है:एसक्यूएल डिलीट कैस्केड पर, किस तरह से विलोपन होता है?

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 विशेषता का संदर्भ देता है।

मेरा सवाल यह है कि जब दोनों संबंधों में से किसी एक में विलोपन होता है, तो किस तरह से विलोपन कैस्केड होता है? अगर मैं Courses संबंध में एक टुपल हटा देता हूं, तो क्या यह BookCourses संबंध में सभी संदर्भ टुपल्स को हटा देगा, या यह दूसरी तरफ है?

आपके समय के लिए धन्यवाद।

+7

एक ही चमत्कार क्यों 'Categories' तालिका प्राथमिक कुंजी है, जबकि' Courses' तालिका 'EntryID' है के रूप में एक' CourseID' है। आपको अपने नामकरण विकल्पों पर पुनर्विचार करने की गंभीरता से आवश्यकता है। –

+4

भ्रम और स्पष्ट डीबी संरचना से बचने के लिए उपयोगकर्ता को उचित कॉलम नाम दें। –

उत्तर

152

कैस्केड काम करेगा जब आप तालिका 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

बढ़िया! धन्यवाद। * उत्तर का पालन करें: क्योंकि मैंने इसे सोचा था। अब फिक्स्ड ... और मेरे डीबी * –

+51

में इस जवाब में प्रश्न के मुकाबले अलग-अलग टेबल नाम और संरचनाएं हैं ... इसे बहुत कम उपयोगी बनाना। –

+0

काम नहीं कर रहा है ... – user3177068

संबंधित मुद्दे