Разработка приложений баз данных для СУБД Sybase SQL Anywhere





Таблица 18. Фрагмент таблицы Copies выполнения оператора UPDATE


N_ booksCode_bookPresent

.....................
4911
50601
51601
5231
.....................

Как видно из табл. 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

Code_bookAuthor.......Number

1Коршунов Ю.М........49
3Трауб Дж.......38
............................




Содержание  Назад  Вперед