Любой, кто разработал небольшое веб-приложение, основанное на базе данных, используя MySQL, знает, что создание, извлечение, обновление и удаление таблиц в реляционной базе данных является относительно простыми процессами. Теоретически, если вы овладеете использованием наиболее распространенных операторов SQL и знакомы с языком сценариев на стороне сервера, который вы выберете, этого достаточно, чтобы справиться с различными операциями, необходимыми в таблицах MySQL, особенно когда вы используете Fast Myisam Двигатель базы данных. Но даже в самых простых случаях все сложнее, чем мы думаем. Ниже мы используем типичный пример для иллюстрации. Предположим, вы запускаете сайт блога, который вы обновляете почти каждый день, и сайт позволяет посетителям комментировать ваши сообщения.
В этом случае наша схема базы данных должна включать как минимум две таблицы Myisam, один для хранения ваших сообщений в блоге, а другой для обработки комментариев посетителей. Очевидно, что между этими двумя таблицами существует связь между этими двумя таблицами, поэтому нам необходимо определить внешний ключ во второй таблице, чтобы целостность базы данных можно было поддерживать, когда строки данных обновляются или удаляются.
Для такого приложения, как вышеперечисленное, не только сохраняет целостность двух таблиц серьезной проблемой, но и самая большая задача заключается в том, что мы должны сохранить их целостность на уровне приложения. Это подход, используемый во время разработки для большинства веб -проектов, которые не требуют использования транзакций, поскольку таблицы Myisam обеспечивают отличную производительность.
Конечно, это также стоит за счет. Хотя доступ к базе данных может быть упрощен с помощью использования слоев абстракции и модулей ORM, поскольку увеличение количества таблиц данных, требуемых приложением, логика, необходимая для их обработки, несомненно, станет более сложной.
Итак, для MySQL есть ли какой-либо метод обработки иностранных ключей на уровне базы данных, чтобы помочь поддерживать целостность базы данных? Эта функция позволяет нам запускать определенные действия, такие как обновление и удаление определенных строк данных в таблице, чтобы поддерживать предопределенные отношения.
У всего есть плюсы и минусы, и основной недостаток использования таблиц InnoDB заключается в том, что они медленнее, чем Myisam, особенно в крупномасштабных приложениях, где должно быть запрошено много таблиц. К счастью, таблица Myisam в более новой версии MySQL также поддерживает ограничения иностранного ключа.
В этой статье будет представлена то, как применить ограничения иностранного ключа к таблицам InnoDB. Кроме того, мы будем использовать простой класс MySQL на основе PHP для создания соответствующего образца кода; Теперь мы начинаем представлять, как применять ограничения иностранного ключа к MySQL.
Когда использовать ограничения иностранного ключа
Честно говоря, при использовании таблиц Innodb в MySQL вам не обязательно использовать ограничения иностранного ключа. Он включает в себя два таблица Myisam, используемые для хранения постов в блоге и комментариев.
При определении схемы базы данных нам необходимо установить отношения между двумя таблицами, создав внешний ключ в таблице, где комментарии хранятся для картирования строк данных (то есть комментариев) в конкретную статью. Вот базовый код SQL для создания образца таблицы Myisam:
Сбросить таблицу, если существует `test`.`blogs`;
Создать таблицу `test`.
`id` int (10) unsigned auto_increment,
`tilting 'Текст,
`Контент 'Текст,
`Автор 'varchar (45) по умолчанию NULL,
Prirose Key (`id`)
) Двигатель = myisam default charset = utf8;
Сбросить таблицу, если существует `test`.
Создать таблицу `test` 1.comments` (
`id` int (10) unsigned auto_increment,
`blog_id` int (10) unsigned по умолчанию NULL,
`Комментарий текст,
`Автор 'varchar (45) по умолчанию NULL,
Prirose Key (`id`)
) Двигатель = myisam default charset = utf8;
Выше мы только что определили две таблицы Myisam, которые формируют уровень данных приложения блога. Как вы можете видеть, первая таблица называется блогом. Вторая таблица называется комментариями, которые используются для хранения комментариев, связанных с каждым сообщением в блоге.
До сих пор наша работа была легкой, потому что мы создали только два простых таблица Myisam. Далее, что мы хотим сделать, так это заполнить эти таблицы некоторыми записями, чтобы еще больше продемонстрировать, что следует сделать в другой таблице, когда запись удалена в первой таблице.
Обновление и поддержание целостности базы данных
В предыдущей части мы создали две таблицы Myisam, чтобы служить уровнем данных приложения блога. Конечно, вышеупомянутое введение все еще очень простое, и нам нужно обсудить его дальше. Для этого мы заполним эти таблицы некоторыми записями, используя команды SQL следующим образом:
Вставьте в блоги (ID, название, контент, автор) Values (NULL, «Название первой записи в блоге», «Содержание первой записи в блоге», «Ян»)
Вставьте в комментарии (id, blog_id, comment, автор) Values (null, 1, «Комментируя первую запись в блоге», «Сьюзен Нортон»), (null, 1, «Комментируя первую запись в блоге», «Роуз Уилсон»)
Приведенный выше код фактически имитирует ситуацию, когда читатели Сьюзен и Роуз прокомментировали наш первый блог. Предположим, теперь мы хотим обновить первый блог с другим сообщением. Конечно, эта ситуация возможна.
В этом случае, чтобы поддерживать согласованность базы данных, таблица комментариев также должна быть обновлена соответственно, вручную, либо путем обработки приложения, обрабатывающего уровень данных. Для этого примера мы будем использовать команду SQL для завершения обновления следующим образом:
Обновление блогов SET ID = 2, title = 'Название первой записи блога', Content = 'Содержание первой записи в блоге', Author = 'John Doe', где id = 1
Обновление комментариев Установите blog_id = 2, где blod_id = 1
Как упоминалось ранее, поскольку содержание элемента данных первого блога было обновлено, таблица комментариев также должна отражать это изменение. Конечно, на самом деле эта операция обновления должна быть выполнена на уровне приложения, а не вручную, что означает, что эта логика должна быть реализована с использованием языка на стороне сервера.
Чтобы завершить эту операцию, PHP может использовать простой подпроцесс, но на самом деле, если используются ограничения иностранного ключа, операция обновления таблицы комментариев может быть делегирована в базу данных.
Как упоминалось ранее в статье, таблицы MySQL Innodb обеспечивают беспроблемную поддержку этой функции. Поэтому в последующей части мы будем использовать ограничения внешнего ключа для воссоздания предыдущего примера кода.
Каскадные обновления в базе данных
Ниже мы перестанем реструктурировать предыдущий пример кода с использованием ограничений иностранного ключа и таблицы InnoDB (вместо типа Myisam по умолчанию). Для этого сначала переопределите две примеры таблицы, чтобы они могли использовать конкретный двигатель базы данных. Для этого вы можете использовать код SQL, например, следующее:
Сбросить таблицу, если существует `test`.`blogs`;
Создать таблицу `test`.
`id` int (10) unsigned auto_increment,
`tilting 'Текст,
`Контент 'Текст,
`Автор 'varchar (45) по умолчанию NULL,
Prirose Key (`id`)
) Engine = Innodb default charset = utf8;
Сбросить таблицу, если существует `test`.
Создать таблицу `test` 1.comments` (
`id` int (10) unsigned auto_increment,
`blog_id` int (10) unsigned по умолчанию NULL,
`Комментарий текст,
`Автор 'varchar (45) по умолчанию NULL,
Prirose Key (`id`),
Ключ `blog_ind` (` blog_id`),
Ограничение `comments_ibfk_1` Foreign Key (` blog_id`) Ссылки `blogs` (` id`) на обновление каскад
) Engine = Innodb default charset = utf8;
Очевидное различие между кодом здесь и предыдущим кодом состоит в том, что две таблицы теперь используют двигатель NODB хранения, поэтому они могут поддерживать ограничения внешнего ключа. Кроме того, нам также необходимо обратить внимание на код, который определяет таблицу комментариев:
Ограничение `comments_ibfk_1` Foreign Key (` blog_id`) Ссылки `blogs` (` id`) на обновление каскад
Фактически, это утверждение уведомляет MySQL, что когда таблица блогов обновляется, значение блога Foreign Key Blog в таблице комментариев также следует обновлять. Другими словами, что сделано здесь, это позволить MySQL поддерживать целостность базы данных каскадным образом. .
Два примера таблицы MySQL были определены сейчас.
«Обновление блогов SET ID = 2, title = 'Название первой записи блога», Content =' Содержание первой записи блога ', Author =' John Doe ', где id = 1 "
Как упоминалось ранее, нам не нужно обновлять таблицу комментариев, потому что MySQL будет обрабатывать это автоматически. Кроме того, вы можете заставить MySQL ничего не делать, пытаясь обновить строку в таблице блогов, удалив часть «On Update» запроса или указав «Нет действий» и «ограничение». Конечно, вы также можете позволить MySQL делать другие вещи, которые будут представлены в последующих статьях.
Благодаря вышеупомянутому введению, я думаю, что у каждого есть четкое понимание того, как использовать иностранные ключевые ограничения в сочетании с таблицами InnoDB в MySQL.