Ссылочная целостность не работает в отношении N: N - PullRequest
0 голосов
/ 01 октября 2011

Это сценарий создания таблицы MS:

Это отношение N: M между SchoolclassCode и таблицей Pupil

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

Запись в таблице школьных кодов удалена. Но не более того. Я даже могу дополнительно удалить schoolclasscodeId_FK в SchoolclasscodePupil, но никакие ученики не были удалены из-за ограничения каскадного удаления.

Что я не прав?

1 Ответ

1 голос
/ 01 октября 2011

В отношении N:M либо N, либо M может быть нулем.Ссылочная целостность не была нарушена.

Удаление класса приведет к отмене регистрации всех учеников этого класса.Точно так же удаление ученика развернет их из всех классов.Но удаление ученика никогда не может привести к отмене класса каскадом, равно как и удаление класса не может исключить ученика.Даже если это последний урок, который посещал ученик, у тебя остается ученик, у которого нулевые классы, что действует в соответствии с правилами ссылочной целостности.

...