Автоматическое обновление и удаление ключей
Внешние ключи позволяют обеспечить целостность вновь добавленных записей. А если из таблицы, указанной в предложении REFERENCES, удаляется запись? Что происходит с записями в подчиненных таблицах, использующих это значение в роли внешнего ключа?
Очевидно, что эти записи будут также удалены. В противном случае утерянные записи засорят вашу базу данных. Начиная с MySQL 3.23.50 эта задача существенно упрощается, что позволяет добавить предложение ON DELETE к модификатору FOREIGN KEY ... REFERENCES, который недвусмысленно указывает, что нужно делать серверу базы данных с утерянными записями в такой ситуации.
Рассмотрим следующий пример, в котором категории и товары связаны между собой через идентификатор категории.
Сообщение об ошибке
Предложение ON DELETE CASCADE обеспечивает удаление всех товаров из таблицы articles, связанных с категорией, удаленной из таблицы categories. Это четко видно из следующего фрагмента.
Сообщение об ошибке
Таким образом, при удалении определенной категории, MySQL также автоматически удалит все записи, связанные с этой категорией в связанных таблицах.
В табл. 8.2 представлены четыре ключевые слова, которые могут указываться после предложения ON DELETE.
На заметку
MySQL еще не поддерживает действие модификатора SET DEFAULT в предложениях ON DELETE или ON UPDATE. В других реляционных СУБД модификатор SET DEFAULT используется для задания значения по умолчанию в случае удаления или изменения внешних ключей.
Сообщение об ошибке
Что же происходит при использовании ключевого слова RESTRICT (которое является значением по умолчанию)? MySQL не удаляет запись, которая ссылается на ключ в таблице articles.
Сообщение об ошибке
Начиная с MySQL 4.0.8, можно выполнять эти автоматические действия заданием предложения ON UPDATE, которое работает аналогично предложению ON DELETE. Например, добавление предложения ON UPDATE CASCADE по определению внешних ключей, для MySQL означает, что при модификации первичной таблицы (таблица, на которую делается ссылка при проверке внешних ключей) все записи, использующие текущую таблицу, будут также автоматически модифицированы с новыми значениями, что обеспечит целостность системы.
Это можно показать на примере. Рассмотрим следующие две таблицы, которые связаны между собой с помощью условия ON UPDATE CASCADE по коду штата США.
Сообщение об ошибке
Сообщение об ошибке
Если теперь модифицировать один из кодов в таблице states, предложение ON UPDATE CASCADE обеспечит автоматическую модификацию содержимого всех записей таблицы votes новым кодом штата. Это показано в следующем примере.
Сообщение об ошибке
Я робот
Следует помнить, что автоматизация операций с помощью правил ON UPDATE и ON DELETE может привести к серьезному повреждению данных в том случае, если связи между таблицами с помощью ключей досконально не продуманы. Например, при наличии последовательности связанных между собой таблиц и использовании правил ON DELETE CASCADE, изменение в главных таблицах может привести к удалению связанных с ними записей без дополнительного предупреждения. Поэтому эти правила нужно предварительно неоднократно проверить.