- •Министерство образования и науки Российской Федерации
- •В информационных технологиях и информационных системах
- •Часть II
- •1. Особенности проектирования многотабличных баз данных
- •2 Определение связей между таблицами
- •2.1 Объединения
- •2.2 Ограничения и поддержание целостности данных
- •2.2.1 Ограничения в базе данных
- •2.2.2 Поддержание целостности данных
- •2.3 Связывание таблиц
- •2.4 Создание форм для ввода данных
- •3 Многотабличные запросы
- •4 Создание форм на основе нескольких таблиц или многотабличных запросов
- •4.1 Создание подчиненных форм
- •4.2 Вычисление итоговых значений
- •4.3 Добавление в существующую подчиненную форму другой подчиненной формы
- •4.4 Связывание главной и подчиненной форм
- •4.5 Всплывающие формы и окна диалога
- •5 Макросы и модули
- •6 Создание интерфейса
- •Задания для самостоятельной работы
- •Литература
- •Часть II
- •610000, Киров, ул. Ленина, 104
2.2.2 Поддержание целостности данных
При поддержании ссылочной целостности между главной и подчиненной таблицами часто используются следующие правила:
подчиненная строка не может быть вставлена, пока не существует главная строка; однако в поле внешнего ключа возможен ввод пустых значений, показывающих, что записи только подготавливаются и пока не являются связанными;
главная строка не может быть удалена до удаления всех подчиненных строк;
если значение первичного ключа в главной строке изменено, все значения внешнего ключа, которые обращаются к этому значению первичного ключа, должны быть также обновлены, и, наоборот, нельзя изменить значение ключевого поля в главной таблице, если существуют связанные записи.
Чтобы наложить эти правила на конкретную связь, при ее создании следует установить флажок Обеспечение целостности данных в окне Изменение (Relationships) (рисунок 5.3). Если данный флажок установлен, то любая попытка выполнить действие, нарушающее одно из перечисленных выше правил, приведет к выводу на экран предупреждения, а само действие выполнено не будет.
Каскадное обновление и каскадное удаление
Если для связей, определена целостность данных, пользователь имеет возможность указать, следует ли автоматически выполнять для связанных записей операции каскадного обновления и каскадного удаления. Если включить данные параметры, станут возможными операции удаления и обновления, в противном случае запрещенные условиями целостности данных. Чтобы обеспечить целостность данных при удалении записей или изменении значения ключевого поля в главной таблице, автоматически вносятся необходимые изменения в связанные таблицы.
Если при определении связи в окне Изменение связей (Relationships) установить флажок Каскадное обновление связанных полей (Cascade Update Related Fields), любое изменение значения в ключевом поле главной таблицы приведет к автоматическому обновлению соответствующих значений во всех связанных записях. Например, при изменении кода города в таблице "Город" будет автоматически обновлено поле "Код Города" во всех записях таблицы "Разговор" для каждого разговора абонента с этим городом, поэтому целостность данных не будет нарушена. Access выполнит каскадное обновление без ввода предупреждающих сообщений.
Примечание: Если в главной таблице ключевым полем является поле счетчика, то установление флажка Каскадное обновление связанных полей (Cascade Update Related Fields) не приведет к каким-либо результатам, так как изменить значение поля счетчика невозможно.
Если при определении связи установить флажок Каскадное удаление связанных записей (Cascade Delete Related Records), любое удаление записи в главной таблице приведет к автоматическому удалению связанных записей в подчиненной таблице. Например, при удалении из таблицы "Абонент" записи конкретного абонента будут автоматически удалены все связанные записи в таблице "Разговор". Если записи удаляются из формы или таблицы при установленном флажке Каскадное удаление связанных записей (Cascade Delete Related Records), Access выводит предупреждение о возможности удаления связанных записей. Если же записи удаляются с помощью запроса на удаление записей, то удаление осуществляется автоматически без вывода предупреждения.
