Фрагмент таблицы Copies выполнения оператора UPDATE
....... | ....... | ....... |
49 | 1 | 1 |
50 | 60 | 1 |
51 | 60 | 1 |
52 | 3 | 1 |
....... | ....... | ....... |
Как видно из табл. 17, 18, изменение адресуемого поля родительской таблицы автоматически влечет изменение значение полей, входящих в состав внешнего ключа дочерней таблицы. При модификации неключевых полей родительской таблицы, дочерняя таблица останется неизменной.
Для отмены результатов произведенной модификации таблиц выполним оператор ROLLBACK - оператор отката к началу транзакции. При этом содержимое виртуальной памяти обнуляется, а на внешнем носителе база данных остается неизменной.
Теперь попробуем удалить запись родительской таблицы, на которую имеются ссылки из дочерней таблицы - запись, у которой поле Code_book=2. Для этого выполним оператор вида:
// Удаление записи таблицы DELETE FROM Stepanov.Books WHERE Code_book=2
Поскольку для внешнего ключа Code_book такие действия запрещены, пользователю будет выдано сообщение "primary key for row in table 'Copies' is referenced in another table". Оно является сообщением об аварийном завершении оператора и означает, что на первичный ключ текущей таблицы (в нашем случае таблица Stepanov.Books) имеется ссылка из таблицы Copies.
Проверим действие внешнего ключа для таких ограничений ссылочной целостности как Update Action/Restrict Update и Delete Action/ Cascade (). Установить эти ограничения можно следующим образом. Щелкните правой кнопки мыши по пиктограмме внешнего ключа Code_book (). В появившемся в результате этого контекстном меню выберите пункт Properties. В открывшемся окне свойств внешнего ключа выберите закладку Integrity. Она в имеет такой же вид как и окно шага 5 мастера Add Foreign Key (). Манипулирование переключателями Update Action и Delete Action данной закладки позволяют решить поставленную задачу.
Для достижения того же эффекта в ISQL необходимо выполнить следующую последовательность SQL-оператор:
/* Удаление существующего внешнего ключа таблицы данных*/ ALTER TABLE Stepanov.Copies DELETE FOREIGN KEY Books_Copies; /* Формирование нового внешнего ключа таблицы данных*/ ALTER TABLE Stepanov.Copies ADD Books_Copies NOT NULL FOREIGN KEY(Code_book) // в состав // ключа входит только поле Code_book REFERENCES // ключ ссылается на поле Stepanov.Books(Code_book) //Code_book //таблицы Stepanov.Books */ ON UPDATE RESTRICT /* запрещение модификации адресуемых полей родительской таблицы */ ON DELETE CASCADE; /* каскадное удаление записей таблицы дочерней таблицы, ссылающихся на удаляемую запись родительской таблицы */
Выполним те же SQL-операторы UPDATE и DELETE уже при этих ограничениях целостности. При этом выполнение оператора UPDATE будет запрещено. Результатом работы оператора DELETE будет изменение таблиц Books и Copies, представленное в табл. 19, 20.
Таблица 19. Фрагмент таблицы Books после выполнения оператора DELETE
1 | Коршунов Ю.М. | ....... | 49 |
3 | Трауб Дж | ....... | 38 |
....... | ....... | ....... | ....... |