SQL SİLİNDİR SİLİNDİR ÜZERİNDE SİLME, SİLME NASIL YAPILIR?


156

Bir veritabanında iki ilişki varsa, şöyle:

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
);

ve ikisi arasında şu şekilde bir yabancı anahtar ilişki kurarım:

ALTER TABLE BookCourses
ADD FOREIGN KEY (Course)
REFERENCES Courses(Code)
ON DELETE CASCADE;

Sonra görebilirsiniz Courseöznitelik BookCoursesilişkisi başvuran Codeiçinde niteliğini Coursesilişkisi.

Benim sorum şu iki ilişkiden herhangi birinde bir silme gerçekleştiğinde, silme işlemi hangi yolla artar? Coursesİlişkideki bir tuplei silersem, ilişkideki tüm referans tupleslerini silecek mi BookCoursesyoksa tersi mi olacak?


11
Biri, Categoriestablonun sahip CourseIDolduğu sırada neden tablonun birincil anahtar olarak a olduğunu merak Courseseder EntryID. Adlandırma tercihlerinizi ciddiye almanız gerekir.
ypercubeᵀᴹ

7
Karışıklığı önlemek ve DB yapısını temizlemek için lütfen uygun sütun adlarını kullanın.
Gunjan Shah

Yanıtlar:


185

Cascade, tablodaki bir şeyi sildiğinizde çalışır Courses. Tablodaki tabloya BookCoursesreferans olan tüm kayıtlar Coursesotomatik olarak silinecektir.

Ancak tablodan silmeye çalıştığınızda BookCourses, tablonun kendisi etkilenmez, yalnızca tablonun kendisi etkilenir.Courses

Takip eden soru: Neden CourseIDKategori kategorisinde var?

Belki şemanızı buna göre yeniden yapılandırmalısınız,

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
Harika! Teşekkür ederim. takip cevap: Çünkü ben çok düşündüm. Şimdi düzeltildi ... ve
DB'mde

59
Bu cevabın sorudan farklı tablo isimleri ve yapıları var ... Çok daha az kullanışlı hale getirmek.
Daniel Beardsley

4
@DanielBeardsley, bu cevabın yararlı olmadığını kabul etmiyorum. Eğer söylediklerini okursanız. Bununla birlikte, cevabın biçimlendirilebileceğini kabul ediyorum, böylece gerçek cevabın bir parçası ve başka bir tartışma nedir. Yukarıda vurgulanan şema takip sorusuyla ilgilidir, fakat asıl sorunun cevabı ile ilgili değildir.
Baldur

26

İşte bu eski gönderiyi ziyaret eden diğerleri için basit bir örnek, ancak sorudaki örnekle karıştırılıyor:

Teslimat -> Paket (Bir -> Çok)

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 (Package) yabancı anahtarıyla giriş, FK ilişkisinde (Delivery) başvurulan varlıkla silinir.

Dolayısıyla bir Teslimat silindiğinde referans veren Paketler de silinecektir. Bir Paket silinirse, teslimatlarda hiçbir şey olmaz.


Anlaşılması kolay örnek için teşekkür ederiz!
Tom Spencer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.