Создание приложений для работы с базами данных в сети 557

NO ACTION    при наличии подчиненных записей в дочерней таблице удале-
ние или изменение соответствующей записи головной таблицы
запрещены

CASCADE     при удалении записи в головной таблице происходит удаление
всех подчиненных ей записей в дочерней таблице; при измене-
нии записи в головной таблице изменяется значение ключево-
го поля во всех подчиненных ей записях дочерней таблицы

SET DEFAULT при удалении или изменении записи головной таблицы ключе-
вому полю во всех подчиненных записях дочерней таблицы
присваивается значение по умолчанию

SET NULL     в ключевое поле подчиненных записей дочерней таблицы за-
носится NULL

В базе данных, которая используется в данной книге, головной таблицей, оче-
видно, должна быть таблица описания подразделений Dep с полем Dep — подраз-
деление, являющимся ее первичным ключом. Дочернюю таблицу Pers можно свя-
зать с ней по ее полю Dep — подразделению, в котором работает сотрудник. При
переименовании подразделения (изменении записи в головной таблице) в дочерней
таблице тоже должно каскадно изменяться название этого подразделения во всех
содержащих его записях. Для осуществления этого надо задать режим ON
UPDATE CASCADE. При ликвидации подразделения (удалении записи в головной
таблице) возможно, по-видимому, несколько вариантов. Если указать режим ON
DELETE CASCADE, то все записи в таблице Pers, относящиеся к этому подразделе-
нию, автоматически удалятся, т.е. все сотрудники подразделения окажутся уво-
ленными и сведения о них исчезнут. Вероятно, это неудачный вариант, так как в
реальной жизни сотрудники ликвидированного подразделения частично могут
быть переведены в другие подразделения. Логичнее указать режим ON DELETE
SET NULL. В этом случае записи сотрудников ликвидированного подразделения
будут помечены значением NULL в поле Dep. И в дальнейшем администрация мо-
жет решать судьбу каждого такого сотрудника индивидуально. Но значение NULL
отсутствует в головной таблице и, значит, соответствующие записи таблицы Pers
окажутся не привязанными к таблице Dep. Вероятно, наиболее удобный вариант -
установить режим ON DELETE SET DEFAULT, в таблице Pers для поля Dep ввести
значение по умолчанию (например, «Неизвестный») и в головной таблице Dep вве-
сти запись с аналогичным значением поля Dep. Тогда запросы, создающие эти таб-
лицы, могут иметь вид:

/* Создание таблицы Dep */
create table Dep(

Dep char(15) Not Null Primary Key,

Proisv char(l)
);

/* Создание таблицы Pers */
create table Pers(

Num smallint Not Null Primary Key,

Dep char(15) DEFAULT "Неизвестный",

Fam char(20) Not Null,

Nam char(20) Not Null,

Par char(20) Not Null,

FOREIGN KEY (Dep) REFERENCES Dep
ON DELETE SET DEFAULT ON UPDATE CASCADE,

При создании нескольких таблиц можно обеспечивать целостность данных на
уровне ссылок. Это означает, что в одной из таблиц некоторое поле может иметь