Ссылочная целостность
Рассмотрим наиболее часто встречающуюся в базах данных связь один-ко-многим. Соответствующие таблицы показаны на рис. 2.8. Как можно заметить, дочерняя и родительская таблицы связаны между собой по общему полю «Товар». Назовем это поле полем связи.
Таблица «Товары» Таблица «Отпуск товаров»
![](image/2-4-ssylochnaja-celostnost_1.gif)
Рис. 2.8. Связанные таблицы базы данных
Возможны два вида изменений, которые приведут к утере связей между записями в родительской и дочерней таблицах:
· изменение значения поля связи в записи родительской таблицы без изменения значений полей связи в соответствующих записях дочерней таблицы;
· изменение значения поля связи в одной из записей дочерней таблицы без соответствующего изменения значения полей связи в родительской и дочерней таблицах.
Рассмотрим первый случай. На рис. 2.9 показано изменение значения поля «Товар» с «Сахар» на «Рафинад» в таблице «Товары». В таблице «Отпуск товаров» значение поля связи «Сахар» осталось прежним. В результате:
· в дочерней таблице «Отпуск товаров» для товара «Рафинад» (таблица «Товары») нет сведений о его отпуске со склада;
· некоторые записи таблицы «Отпуск товаров» содержат сведения об отпуске товара «Сахар», о котором нет информации в таблице «Товары».
Таблица «Товары» Таблица «Отпуск товаров»
![]() |
Рис. 2.9. Нарушение целостности базы данных; записи
с товаром «Сахар» (таблица «Отпуск товаров») не имеют
родительской записи
Рассмотрим второй случай. Пусть в одной из записей таблицы «Отпуск товаров» значение поля связи «Сахар» изменилось на «Рафинад» (рис. 2.10). В результате:
· в дочерней таблице «Отпуск товаров» недостоверны сведения об отпуске со склада товара «Сахар» (таблица «Товары»);
· одна из записей таблицы « Отпуск товаров» содержит данные об отпуске товара «Рафинад», сведения о котором отсутствуют в таблице «Товары».
Таблица «Товары» Таблица «Отпуск товаров»
![](image/2-4-ssylochnaja-celostnost_3.gif)
Рис. 2.10. Нарушение целостности базы данных: запись
с товаром «Рафинад» (таблица «Отпуск товаров»)
не имеет родительской записи
И в первом, и во втором случае мы наблюдаем нарушение целостности базы данных, это означает, что хранящаяся в ней информация становится недостоверной.
СУБД обычно блокирует действия, которые нарушают целостность связей между таблицами, т.е. нарушают ссылочную целостность. Когда говорят о ссылочной целостности, имеют в виду совокупность связей между отдельными таблицами во всей БД. Нарушение хотя бы одной такой связи делает информацию в БД недостоверной.
Чтобы предотвратить потерю ссылочной целостности, используется механизм каскадных изменений.
Он состоит в обеспечении следующих действий:
· при изменении поля связи в записи родительской таблицы следует синхронно изменить значения полей связи в соответствующих записях дочерней таблицы;
· при удалении записи в родительской таблице следует удалить соответствующие записи в дочерней таблице.
Изменения или удаления в записях дочерней таблицы при одновременном изменении (удалении) записи родительской таблицы называются каскадными изменениями и каскадными удалениями.
Существует другая разновидность каскадного удаления: при удалении родительской записи в записях дочерних таблиц значения полей связи обнуляются. Эта разновидность применяется редко, т.к. дочерние таблицы в этом случае будут содержать избыточные данные, например, сведения о товаре, которого нет на складе.
Обычно для реализации ссылочной целостности в дочерней таблице создают внешний ключ, в который входят поля связи с дочерней таблицы. Этот ключ для дочерней таблицы является первичным и поэтому по составу полей должен совпадать с первичным ключом родительской таблицы или реже – с частью первичного ключа.