Следует обратить внимание на то, что внешний ключ может ссылаться на первичный ключ той же самой таблицы, т.е. может быть реализовано рекурсивное отношение.
Предложения ON DELETE и ON UPDATE используются вместе с REFERENCES при определении внешнего ключа и предназначены для описания типа изменения внешнего ключа при изменении соответствующего ему значения первичного ключа. Т.е. для столбца внешнего ключа таблицы-потомка задаются действия, автоматически выполняемые при удалении или обновлении поля первичного ключа в таблице-родителе, на который ссылается данный внешний ключ.
Для указания действий, которые должны выполняться над полем внешнего ключа при удалении и обновлении данных поля первичного ключа, используются следующие параметры:
- NO ACTION (используется по умолчанию) означает, что удаление или обновление первичного ключа родительской таблицы не изменяет ссылающийся внешний ключ, вследствие чего попытка операции над родительской таблицей может закончиться неудачей;
- CASCADE для ON DELETE удаляет строки, содержащие значение ссылающегося внешнего ключа, а для ON UPDATE обновляет ссылающийся внешний ключ новым значением первичного ключа;
- SET DEFAULT устанавливает значение ссылающегося внешнего ключа в заданное для него значение по умолчанию;
- SET NULL устанавливает значение ссылающегося внешнего ключа в NULL.
Предложения ON DELETE и ON UPDATE могут использоваться одновременно (т.е. для столбца в одном ограничении могут быть указаны действия, которые необходимо выполнить при удалении, а также действия, которые необходимо выполнить при обновлении).
Например, необходимо создать таблицу Request, определив поле AccountCD в качестве внешнего ключа, ссылающегося на первичный ключ таблицы Abonent. Необходимо также, чтобы при удалении поля первичного ключа в таблице Abonent удалялись строки с соответствующим значением внешнего ключа в таблице Request. При обновлении первичного ключа в таблице Abonentдолжно происходить обновление соответствующего внешнего ключа в таблице Request. Следующий запрос создает требуемую таблицу: CREATE TABLE Request
предыдущаяследующая