У меня вопрос о настройках внешнего ключа в отношении таблиц мостов. Я до сих пор не понимаю, как работает процесс удаления. В настоящее время для всех моих внешних ключей установлено значение При удалении: нет действия, значит ли это, что в случае таблицы мостов для удаления записей в одной или обеих родительских таблицах мне придется удалить записи, которые они содержат. сначала в таблице мостов или это работает по-другому с отношениями «многие ко многим»? Приносим свои извинения, если это простой и глупый вопрос, но кому-то, кто плохо знаком с базами данных, кажется, довольно сложно найти где-нибудь ясную, простую и понятную документацию, объясняющую эти вещи.
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
автоматически удаляются все строки, которые ссылаются на курс. Если вы не используете эту опцию, то попытка удалить курс вернет ошибку.
Похожие вопросы
Новые вопросы
mysql
MySQL — это бесплатная система управления реляционными базами данных (RDBMS) с открытым исходным кодом, которая использует язык структурированных запросов (SQL). НЕ ИСПОЛЬЗУЙТЕ этот тег для других БД, таких как SQL Server, SQLite и т. д. Это разные БД, которые используют свои собственные диалекты SQL для управления данными. В вопросе всегда указывайте точную версию сервера. Версии 5.x сильно отличаются по своим возможностям от версий 8+.