Петров Владимир Николаевич
Шрифт:
Внешний ключ может быть добавлен и после создания таблицы – с помощью оператора ALTER TABLE (естественно, только в том случае, если используемая реализация SQL поддерживает данный оператор). Синтаксис оператора ALTER TABLE для создания внешнего ключа:
Примечание.
Следует иметь в виду, что при использовании оператора ALTER TABLE для создания связи между таблицами необходимо, чтобы связываемые таблицы находились в состоянии ссылочной целостности. Иначе при попытке выполнения оператора будет выдано сообщение об ошибке.
Внешний ключ ограничивает значения, которые можно ввести в таблицу. Чтобы в поля, составляющие внешний ключ, можно было ввести некоторое значение, необходимо, чтобы это значение уже было введено в родительской таблице. Например, чтобы занести в таблицу СОТРУДНИКИ данные о новом сотруднике, необходимо, чтобы в таблице ФИЗИЧЕСКИЕ ЛИЦА уже существовала запись о его личных данных – иначе невозможно будет заполнить обязательное поле Код_физического_лица.
Для внешнего ключа может быть задано ограничение NOT NULL, но это необязательно, а в некоторых случаях даже нежелательно. Например, предположим, что в организацию принимается на работу новый сотрудник, но еще не определена однозначно должность, которую он займет. В этом случае можно занести все необходимые данные о нем в таблицы ФИЗИЧЕСКИЕ ЛИЦА и СОТРУДНИКИ, ничего не указывая в поле Код_должности, которое будет заполнено позже.
Ограничение внешнего ключа также оказывает влияние на удаление и модификацию записей родительской таблицы. Значение родительского ключа, на которое ссылается какой-либо внешний ключ, не может быть удалено или изменено. Это означает, например, что нельзя удалить из таблицы ФИЗИЧЕСКИЕ ЛИЦА запись о сотруднике, если она связана с записью в таблице СОТРУДНИКИ. Это вполне понятно – если в таблице СОТРУДНИКИ присутствует запись о сотруднике фирмы, а из таблицы ФИЗИЧЕСКИЕ ЛИЦА запись об этом сотруднике удалена, то информация о его личных данных будет потеряна. Если же сотрудник уволился, и запись о нем из таблицы СОТРУДНИКИ удалена, то нет необходимости хранить информацию о его личных данных, и соответствующая запись из таблицы ФИЗИЧЕСКИЕ ЛИЦА также может быть удалена.
Аналогично, нельзя изменять значение родительского ключа, на который ссылается какой-либо внешний ключ – это также приведет к потере информации и нарушению ссылочной целостности базы данных.
Примечание.
В некоторых реализациях SQL имеется возможность задавать для внешних ключей каскадное удаление и каскадное обновление. Это означает, что при попытке удалить или модифицировать значение родительского ключа, на которое ссылается внешний ключ, соответствующие записи внешнего ключа также будут удалены (каскадное удаление) или изменены (каскадное обновление). Данные возможности в стандарте ANSI SQL-92 не прописаны.
Один из синтаксических вариантов задания каскадного обновления и удаления выглядит так:
Ключевые фразы UPDATE OF и DELETE OF указываются в операторе CREATE TABLE. Вместо ключевого слова CASCADES можно указать слово RESTRICTED – в этом случае изменение и удаление значений родительского ключа, на которые ссылается внешний ключ из данной таблицы, будет запрещено. Пример: