Database Engine может по-разному реагировать на удаление или изменение первичного ключа таблицы. Если вы постараетесь изменить значение внешнего ключа, и это изменение повлечет несогласованность с соответствующим первичным ключом (см. случаи 1 и 2 в предыдущем разделе), система базы данных всегда будет отменять такое изменение и выдаст сообщение вроде следующего:
Server: Msg 547, Level 16, State 1, Line 1
UPDATE statement conflicted with COLUMN FOREIGN KEY constraint 1FKemployee'. The conflict occurred in database 'sample', table 'employee', column 'dept_no'. The statement has been terminated.
(Оператор изменения конфликтует с ограничением внешнего ключа для столбца 'FKemployee'. Конфликт появился в базе данных 'sample', в таблице 'employee', в столбце 'dept_no'. Выполнение оператора завершено.)
Однако если вы пытаетесь изменять первичный ключ, и это изменение приводит к несогласованности соответствующего внешнего ключа (см. случаи 3 и 4 в предыдущем разделе), то система базы данных может реагировать очень гибко. Существуют четыре опции, определяющие, как система базы данных может реагировать.
♦ no action. Позволяет вам модифицировать (изменять или удалять) только те значения в родительской таблице, которые не имеют соответствующих значений внешнего ключа в родительской таблице.
♦ cascade. Позволяет вам модифицировать (update или delete) все значения в родительской таблице. Если указана эта опция, то строки будут изменены (update) или удалены (delete) из дочерней таблицы, если соответствующее значение первичного ключа родительской таблицы было изменено или вся строка удалена из родительской таблицы.
♦ set null. Опять же позволяет вам изменять и удалять значения в родительской таблице. Если вы собираетесь изменить значение в родительской таблице, и это изменение приводит к несогласованности данных в дочерней таблице, то система базы данных устанавливает все соответствующие значения внешнего ключа дочерней таблицы в null. Аналогично, если вы собираетесь удалить строку из родительской таблицы, и это удаление значения первичного ключа приводит к несогласованности данных, то система базы данных устанавливает все соответствующие значения внешнего ключа в null. Таким образом устраняются все несогласованности данных.
♦ set default. Аналогично опции set null за одним исключением: все соответствующие значения внешнего ключа устанавливаются в значение по умолчанию. (Очевидно, что значение по умолчанию должно все-таки существовать в первичном ключе одной из строк родительской таблицы.)
Пример 5.12 показывает использование опций on delete и on update.
В примере 5.12 создается таблица works_oni, которая использует опции on delete cascade и on update cascade. Если вы загружаете таблицу works_onl с содержимым, показанным в табл. 1.4, то каждое удаление строки в таблице employee приведет к дополнительному удалению всех тех строк таблицы works_oni, которые имеют соответствующее значение в столбце emp_no. Аналогично, каждое изменение значения в столбце project_no в таблице project приведет к таким же изменениям всех соответствующих значений столбца projectno таблицы works_onl.