У меня вопрос о настройках внешнего ключа в отношении таблиц мостов. Я до сих пор не понимаю, как работает процесс удаления. В настоящее время для всех моих внешних ключей установлено значение При удалении: нет действия, значит ли это, что в случае таблицы мостов для удаления записей в одной или обеих родительских таблицах мне придется удалить записи, которые они содержат. сначала в таблице мостов или это работает по-другому с отношениями «многие ко многим»? Приносим свои извинения, если это простой и глупый вопрос, но кому-то, кто плохо знаком с базами данных, кажется, довольно сложно найти где-нибудь ясную, простую и понятную документацию, объясняющую эти вещи.

1
Seq76 26 Июл 2020 в 14:27

1 ответ

Лучший ответ

Правило довольно простое:

Вы не можете удалить строку, если существует другая строка, которая ссылается на ту, которую вы хотите удалить.

Пример: курс фотографии колледжа создан в виде строки в таблице courses.

INSERT INTO courses SET course_id = 1234, title = 'Photography';

На курс записываются:

INSERT INTO enrollments SET course_id = 1234, student_id = 9877;
INSERT INTO enrollments SET course_id = 1234, student_id = 9876;
INSERT INTO enrollments SET course_id = 1234, student_id = 9875;

Затем инструктор хочет отменить курс.

DELETE FROM courses WHERE course_id = 1234;

Это заблокировано, потому что есть строки в enrollments, которые ссылаются на строку в courses.

Точно так же студент может захотеть уйти из школы в этом семестре. Они пытаются удалить свою запись:

DELETE FROM students WHERE student_id = 9877;

Это заблокировано, потому что студент все еще учится в классе фотографии.

Класс enrollments представляет собой соединительную таблицу (я называю эти таблицы пересечений, но официальной терминологии для этих типов таблиц нет). По сути, это пара столбцов внешнего ключа, которые ссылаются на соответствующие таблицы courses и students.

Ограничения внешнего ключа в enrollments требуют, чтобы каждая из указанных строк в двух других таблицах существовала. Вы не можете удалить ни строку courses, ни строку students, пока на нее ссылается регистрация.

Способ справиться с этим - удалить зависимую строку (ту, которая имеет ограничение внешнего ключа) перед удалением указанной строки.

Необязательный синтаксис ON DELETE CASCADE заставляет ограничение внешнего ключа обрабатывать это автоматически. То есть при удалении строки в courses автоматически удаляются все строки, которые ссылаются на курс. Если вы не используете эту опцию, то попытка удалить курс вернет ошибку.

1
Bill Karwin 26 Июл 2020 в 18:33