2011-10-01 35 views
0

這是MS創建表的腳本:參照完整性的N不起作用:N關係

這是一個N:在SchoolclassCode和瞳孔表米之間關係

CREATE TABLE Schoolclasscode (
    schoolclassId integer PRIMARY KEY AUTOINCREMENT NOT NULL 
); 

CREATE TABLE SchoolclasscodePupil (
    pupilId_FK  integer NOT NULL, 
    schoolclassId_FK integer NOT NULL, 
    /* Foreign keys */ 
    FOREIGN KEY (schoolclassId_FK) 
    REFERENCES Schoolclasscode(schoolclassId) 
    ON DELETE CASCADE 
    ON UPDATE NO ACTION, 
    FOREIGN KEY (pupilId_FK) 
    REFERENCES pupil(pupilId) 
    ON DELETE CASCADE 
    ON UPDATE NO ACTION 
); 

CREATE TABLE pupil (
    pupilId   integer PRIMARY KEY AUTOINCREMENT NOT NULL 
); 

當我刪除SchoolclassCode對象在我的代碼中:

public void DeleteSchoolclass(int schoolclassCodeID, SQLiteConnection con) 
     { 
      using (SQLiteCommand com = new SQLiteCommand(con)) 
      { 
       com.CommandText = "DELETE FROM schoolclasscode WHERE SchoolclassId = @SchoolclassId"; 
       com.Parameters.Add(new SQLiteParameter("@SchoolclassId", schoolclassCodeID)); 
       com.ExecuteNonQuery(); 
      } 
     } 

刪除schoolclasscode表中的條目。但僅此而已。我甚至可以刪除SchoolclasscodePupil中的schoolclasscodeId_FK,但沒有學生被級聯刪除約束刪除。

我該怎麼做?

回答

1

N:M關係中,NM可能爲零。參照完整性沒有受到侵犯。

刪除班級將取消該班級的所有學生的註冊。同樣,刪除學生將從所有班級中展開。但刪除學生絕不會導致級聯取消班級,也不能刪除班級驅逐學生。即使這是學生最後一堂課,但你留下了一個班級爲零的學生,這在參照完整性規則下是有效的。

+0

零班對新生來說可能是一個相當常見的狀態,無論如何 –

+0

@Ben是刪除級聯對學生來說是一個絕望的行動從我哈哈;-)當然它不合邏輯,但好......魔鬼是在細節中。當然,沒有任何課程的學生不會再被加載到我的課程中。但他們仍然在桌子上那是什麼讓我首先困擾我,因爲他們佔用了空間。一個學生可能會有事件報告,這些報告又附有文件......當然,你可能會說現在幾乎一個學生不會經常被刪除,所以我爲什麼要關心其餘的文件......也許...... – msfanboy

+0

好吧,讓我們假設我不要打擾其餘的文件。然後我不在乎RI在這種情況下是正確的:) – msfanboy