Расширенные возможности поддержки ссылочной целостности с помощью внешнего ключа
Расширенные возможности поддержки ссылочной целостности с помощью внешнего ключа
Обычно вполне достаточно декларативного варианта ограничения внешнего ключа, при котором сервер только следит за тем, чтобы в таблицу с внешним ключом нельзя было вставить некорректные значения или - при попытке сделать это возникает ошибка. Но InterBase позволяет выполнять ряд автоматических действий при изменении/удалении внешнего ключа. Для этого служит следующий набор опций внешнего ключа:
[ON DELETE {NO ACTION|CASCADE|SET DEFAULT|SET NULL}]
[ON UPDATE {NO ACTIONjCASCADEjSET DEFAULT]SET NULL}]
Эти опции позволяют определить различные действия при изменении или удалении значения внешнего ключа.
Например, мы можем указать, что при удалении первичного ключа в таблице-мастере необходимо удалять все записи с таким же внешним ключом в подчиненной таблице. Для этого следует так определить внешний ключ:
ALTER TABLE INVENTORY
ADD CONSTRAINT fkautodel
FOREIGN KEY (FK_TITLE) REFERENCES TITLE(ID_TITLE)
ON DELETE CASCADE
Фактически для реализации этих действий создается системный триггер, который и выполняет определенные действия. В табл. 1.2 приведено описание происходящих действий при различных опциях (обратите внимание, что опции NO ACTION|CASCADE|SET DEFAULT|SET NULL не могут использоваться совместно в одном предложении ON XXX).
Событие
Действие
NO ACTION
CASCADE
SET DEFAULT
SET NULL
ON DELETE
При удалении внешнего ключа ничего не делать - используется по умолчанию
При удалении удалить все связанные записи из подчиненной таблицы
При изменении установить поле внешнего ключа в значение по умолчанию
При изменении установить поле внешнего ключа в NULL
ON UPDATE
При изменении ничего не делать - используется по умолчанию
При изменении записи изменить во всех связанных записях в подчиненных таблицах
При удалении установить поле внешнего ключа в значение по умолчанию
При удалении установить поле внешнего ключа в NULL
Если мы ничего не указываем или указываем NO ACTION, то необходимо позаботиться об изменении внешнего ключа (в случае изменения первичного) самостоятельно, а при удалении первичного ключа предварительно удалить записи из подчиненной таблицы.
Осторожно надо обращаться с опцией CASCADE: неосторожное ее использование может привести к удалению большого количества связанных записей.