মুছে ফেলা ক্যাসকেডে এসকিউএল, মুছে ফেলা কীভাবে ঘটে?


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ᵀᴹ

7
বিভ্রান্তি এড়াতে এবং ডিবি কাঠামো পরিষ্কার করতে দয়া করে যথাযথ কলামের নাম ব্যবহার করুন।
গুঞ্জন শাহ

উত্তর:


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
@ ড্যানিয়েলবার্ডসলে, আমি সম্মত নই যে এই উত্তরটি কার্যকর নয়। আপনি যদি এটি পড়েন তবে তা হয়। তবে আমি সম্মত হচ্ছি যে উত্তরটি ফর্ম্যাট করা যেতে পারে তাই এটি প্রকৃত উত্তরটির অংশ কী এবং অন্য কোন আলোচনার বিষয়টি তা পরিষ্কার। উপরে বর্ণিত স্কিমাটি ফলো-আপ প্রশ্নের সাথে সম্পর্কিত তবে প্রকৃত প্রশ্নের উত্তর নয়।
বালদুর

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
)

বিদেশী কী ডেলিভারি_আইডি (প্যাকেজ) সহ এন্ট্রি এফকে সম্পর্কের (ডেলিভারি) রেফারেন্সযুক্ত সত্তার সাথে মোছা হয়।

সুতরাং যখন কোনও ডেলিভারি মুছে ফেলা হয় তখন প্যাকেজগুলি উল্লেখ করে তা মোছা হবে। যদি একটি প্যাকেজ মুছে ফেলা হয় তবে কোনও সরবরাহের ক্ষেত্রে কিছুই হয় না।


উদাহরণস্বরূপ বোঝার জন্য আপনাকে ধন্যবাদ!
টম স্পেন্সার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.