DELETE CASCADE पर SQL, डिलीट करने का कौन सा तरीका है?


156

अगर मेरे पास डेटाबेस में दो संबंध हैं, जैसे:

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संबंध का संदर्भ Codeमें विशेषता Coursesसंबंध।

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


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

7
कृपया भ्रम और स्पष्ट DB संरचना से बचने के लिए उपयोगकर्ता के उचित स्तंभ नाम।
गुंजन शाह

जवाबों:


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
महान! धन्यवाद। उत्तर का पालन करें: क्योंकि मैंने इसे सोचा था। अभी तय ... और मेरे डीबी में
ओलिवर स्प्रीएन

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

4
@DanielBeardsley, मैं इस बात से सहमत नहीं हूं कि यह उत्तर उपयोगी नहीं है। अगर आप पढ़ते हैं तो यह क्या कहता है। हालांकि, मैं मानता हूं कि उत्तर को स्वरूपित किया जा सकता है, इसलिए यह स्पष्ट है कि वास्तविक उत्तर का हिस्सा क्या है और एक और चर्चा क्या है। ऊपर हाइलाइट किया गया स्कीमा अनुवर्ती प्रश्न से संबंधित है, लेकिन वास्तविक प्रश्न का उत्तर नहीं है।
बाल्डुर

26

इस पुराने पोस्ट को प्रस्तुत करने वाले अन्य लोगों के लिए एक सरल उदाहरण है, लेकिन प्रश्न में उदाहरण द्वारा भ्रमित किया गया है:

वितरण -> पैकेज (एक -> कई)

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 (पैकेज) के साथ प्रविष्टि FK संबंध (वितरण) में संदर्भित इकाई के साथ हटा दी जाती है।

इसलिए जब एक डिलीवरी को डिलीट किया जाता है तो यह संदर्भित पैकेज भी डिलीट हो जाएगा। यदि पैकेज हटा दिया जाता है तो किसी भी डिलीवरी से कुछ नहीं होता है।


उदाहरण समझने में आसान के लिए धन्यवाद!
टॉम स्पेन्सर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.