Запрос относительно SQLite и каскадных внешних ключей - PullRequest
0 голосов
/ 11 сентября 2018

В настоящее время я пишу приложение на C #, которое использует базу данных SQLite для хранения информации, введенной пользователем.Приложение представляет собой систему управления для пользователей, которых в приложении называют «Студенты».Это самая важная таблица в моей базе данных, и каждая другая таблица связана с этой таблицей.То, что я хочу сделать, - это когда ученика удаляют - его покидают институт / выгнают и т. Д. - это удалить свои данные из всех других таблиц, чтобы данных больше не было, поскольку они не нужны.Пример некоторых операторов Create table, которые я написал:

CREATE TABLE student(studentID int(5) PRIMARY KEY NOT NULL, name string(16),...,DOB string(8) );

CREATE TABLE emergencyContact(emergencyID int(5) PRIMARY KEY NOT NULL, name string(16),..., contactNumber int(16));

CREATE TABLE emergencyContactOf(studentID int(5) FOREIGN KEY REFERENCES student('studentID'), emergencyID int(5) FOREIGN KEY REFERENCES emergencyContact('emergencyID');

Я прочитал об этом, и я понимаю, что данные будут удалены в таблице EmergencyContactOf, если я включу 'ON DELETE CASCADE'заявление в качестве ключа StudentID больше не будет присутствовать в родительской таблице.

Однако, насколько я понимаю, данные в таблице EmergencyContact, предназначенные для этого конкретного учащегося, не будут удалены, поскольку нет ссылки на StudentID.

Мой вопрос: есть ли способ удалить данные из этой таблицы, которые также относятся к этому студенту?Например, если я должен был включить в таблицу EmergencyContact столбец, который будет ссылаться на StudentID как внешний ключ, а затем удалить эту строку, если StudentID когда-либо удалялся из родительской таблицы?Является ли это хорошим решением этой конкретной проблемы?

Все остальные таблицы, которые у меня есть, также спроектированы таким образом, где данные находятся в разных таблицах, а затем связаны с таблицей ученика с таблицами отношений, так что это такжеприменить ко всем другим таблицам, которые у меня есть.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

У меня вопрос: есть ли способ удалить данные из этой таблицы, которые также относятся к этому студенту? Например, если я должен был включить в таблицу EmergencyContact столбец, который будет ссылаться на StudentID как внешний ключ, а затем удалить эту строку, если StudentID когда-либо удалялся из родительской таблицы? Это хорошее решение этой конкретной проблемы?

Что произойдет, если несколько учеников будут иметь одинаковый экстренный контакт? Вы не хотите дублировать данные, если в этом нет необходимости - в этом вся суть таблицы emergencyContactOf, чтобы эффективно установить связь между многими учениками и аварийными контактами. Таким образом, вы не хотите делать что-то, как вы описываете.

Вы можете периодически (ежемесячно, ежегодно, после чистки списков учеников и т. Д.) Запускать удаление, которое удаляет строки из emergencyContact, если они не отображаются в emergencyContactOf:

DELETE FROM emergencyContact
WHERE emergencyID NOT IN (SELECT emergencyID FROM emergencyContactOf)

или тому подобное.

0 голосов
/ 11 сентября 2018

Хм, я вижу здесь два сценария. Что, если два ученика имеют одинаковый экстренный контакт, скажем, два человека, у которых в качестве экстренного контакта есть их отец?

  1. Если в таком случае вы сохраняете только одну запись (отца) в таблице экстренных контактов, вы не хотите удалять экстренный контакт, если только одна из них уходит. Вы бы удалили экстренный контакт для другого. Поэтому вам понадобится дополнительная логика, когда нужно удалить экстренный контакт. Вы можете поместить это в триггер.
  2. Вы используете менее сложный подход, и несколько строк из таблицы контактов в чрезвычайных ситуациях могут отображаться на одного человека в реальной жизни. В этом случае вы можете перетащить ссылку на учащегося непосредственно в таблицу контактов для экстренных случаев и использовать ON DELETE CASCADE там.

    CREATE TABLE student
                 (studentid int(5),
                  name string(16),
                  ...
                  PRIMARY KEY (studentid),
                  ...);
    ...
    CREATE TABLE emergencycontact
                 (emergencycontactid int(5),
                  studentid int(5),
                  name string(16),
                  ...
                  PRIMARY KEY (emergencycontactid),
                  FOREIGN KEY (studentid)
                              REFERENCES student
                                         (studentid),
                  ...);
    

Второе может быть заманчивым, но первым является «чистый путь», поскольку второй позволяет противоречить данным. Из того, что вы опубликовали, вы уже на «чистом пути». Но упомянуто, что требуется триггеры.

...