Содержание статьи

Связь один ко многим в Microsoft Access – основа реляционных баз данных. Она позволяет объединять таблицы так, чтобы одна запись в главной таблице соответствовала нескольким записям в связанной. Например, один клиент (таблица Клиенты) может иметь несколько заказов (таблица Заказы), но каждый заказ принадлежит только одному клиенту. Без такой связи данные дублируются, что ведёт к ошибкам и неэффективному хранению.
Для реализации связи потребуются две таблицы с общим полем. В главной таблице это поле должно быть первичным ключом (например, ID_Клиента), а в связанной – внешним ключом (например, Клиент_ID). Access автоматически проверяет целостность данных, если включить параметр Обеспечение целостности, но перед этим убедитесь, что типы данных полей совпадают (например, Числовой или Короткий текст).
Процесс настройки связи занимает менее 5 минут, но ошибки на этом этапе приводят к сбоям при запросах и отчётах. Например, если не указать каскадное обновление, изменение ID клиента в главной таблице не обновит связанные записи в таблице заказов. Это критично для систем с динамическими данными. В статье рассмотрены шаги с учётом таких нюансов.
Подготовка таблиц для установления связи

Связь «один ко многим» требует двух таблиц: главной (родительской) и подчиненной (дочерней). В главной таблице поле связи должно быть уникальным – чаще всего это первичный ключ (например, ID_Клиента с типом данных «Счетчик»). В подчиненной таблице создайте поле с тем же типом данных, но без автозаполнения (например, Клиент_ID с типом «Числовой»). Избегайте текстовых полей для связей – они замедляют запросы и занимают больше места.
Перед созданием связи проверьте структуру таблиц на соответствие правилам нормализации. Удалите повторяющиеся данные: если в подчиненной таблице дублируются значения из главной (например, имя клиента), вынесите их в отдельную таблицу. Пример ошибки: хранение названия товара в таблице заказов вместо ссылки на таблицу товаров. Используйте мастер анализа таблиц Access (Работа с базами данных → Анализ → Анализ таблицы) для автоматической проверки.
- Типы данных полей связи должны совпадать. Исключения: связь «Счетчик» (главная) с «Числовой» (подчиненная) допустима, если размер поля в подчиненной таблице – «Длинное целое».
- В подчиненной таблице поле связи не должно быть обязательным, если возможны записи без привязки к главной таблице (например, заказы без указания клиента).
- Для числовых полей установите свойство Индексированное поле в значение «Да (Допускаются совпадения)» – это ускорит выполнение запросов.
Оптимизируйте индексы. В главной таблице первичный ключ индексируется автоматически. В подчиненной таблице добавьте индекс для поля связи вручную: откройте таблицу в режиме конструктора, выделите поле, в свойствах установите Индексированное поле → Да (Допускаются совпадения). Избыточные индексы замедляют вставку данных, поэтому не индексируйте поля, которые редко участвуют в условиях выборки.
Заполните таблицы тестовыми данными до установления связи. В главной таблице добавьте 3–5 записей с уникальными значениями первичного ключа. В подчиненной таблице создайте записи, где поле связи содержит значения из главной таблицы, а также несколько записей с пустыми значениями (если допустимо). Это позволит сразу проверить целостность связи и выявить ошибки в структуре.
Настройка первичного ключа в главной таблице

Первичный ключ в главной таблице – основа связи «один ко многим». В Access выберите таблицу в режиме конструктора, щелкните правой кнопкой по строке нужного поля и выберите «Ключевое поле». Для числовых данных используйте тип «Счетчик» (AutoNumber) – он автоматически генерирует уникальные значения. Если ключ составной (например, из двух полей), выделите их, удерживая Ctrl, и назначьте ключом.

Избегайте текстовых полей в качестве первичного ключа, если данные могут дублироваться. Например, поле «Название» в таблице «Клиенты» ненадежно – лучше добавьте поле «ID_Клиента» с типом «Счетчик». Для существующих данных проверьте уникальность значений перед назначением ключа: откройте таблицу в режиме просмотра, отсортируйте по потенциальному ключевому полю и удалите дубликаты.
Если таблица уже содержит данные, а ключевое поле отсутствует, создайте новое поле с типом «Счетчик» и заполните его автоматически. Для этого добавьте поле в конструкторе, сохраните таблицу, затем откройте ее в режиме просмотра и выполните запрос на обновление: UPDATE Таблица SET НовоеПоле = [ID], где [ID] – временное имя для автозаполнения.
После назначения ключа Access автоматически создаст индекс для ускорения поиска. Убедитесь, что индекс не допускает пустых значений: в свойствах поля установите «Обязательное поле» – «Да» и «Индексированное поле» – «Да (Совпадения не допускаются)». Это гарантирует целостность данных при связывании с подчиненной таблицей.
Добавление внешнего ключа в связанную таблицу

В Access внешний ключ создаётся через поле, ссылающееся на первичный ключ главной таблицы. Например, если в таблице «Заказы» нужно связать записи с таблицей «Клиенты», добавьте поле «ID_Клиента» с типом данных «Числовой» или «Длинное целое». Убедитесь, что формат поля совпадает с первичным ключом главной таблицы – иначе связь не установится. Для проверки откройте конструктор таблицы и сравните типы данных: ошибка в формате приведёт к сообщению «Несоответствие типов данных в выражении условия отбора».
После добавления поля перейдите в режим конструктора и выделите его. В нижней части окна в разделе «Свойства поля» установите параметр «Индексированное поле» в значение «Да (Допускаются совпадения)». Это позволит повторять значения внешнего ключа, что необходимо для связи «один ко многим». Если поле должно содержать только уникальные значения (например, для связи «один к одному»), выберите «Да (Совпадения не допускаются)».
Для автоматического заполнения внешнего ключа используйте подстановку. В конструкторе таблицы выберите поле, затем в разделе «Тип данных» укажите «Мастер подстановок». В первом окне мастера выберите «Объект ‘столбец подстановки’ будет использовать значения из таблицы или запроса», затем укажите главную таблицу и нужное поле (например, «Клиенты.ID_Клиента»). На последнем шаге снимите флажок «Разрешить несколько значений» – иначе связь не будет работать корректно.
После настройки поля сохраните таблицу и перейдите в «Схема данных» (меню «Работа с базами данных»). Перетащите поле внешнего ключа из связанной таблицы на первичный ключ главной таблицы. В появившемся окне «Изменение связей» установите флажок «Обеспечение целостности данных» и выберите тип каскадного обновления или удаления, если это необходимо. Без целостности данных Access не будет контролировать соответствие значений, что приведёт к «сиротским» записям при удалении связанных данных.
Создание связи через окно «Схема данных»

Окно «Схема данных» в Access – инструмент для визуального управления связями между таблицами. Чтобы открыть его, перейдите на вкладку Работа с базами данных, затем выберите Схема данных. Если окно пустое, добавьте нужные таблицы через контекстное меню или кнопку Добавить таблицу.
Для создания связи «один ко многим» перетащите поле первичного ключа из главной таблицы на соответствующее поле внешнего ключа в связанной. Например, если в таблице Клиенты поле ID_Клиента – первичный ключ, а в таблице Заказы поле Клиент_ID – внешний, свяжите их именно так.
После перетаскивания откроется диалоговое окно Изменение связей. Убедитесь, что:
- Тип связи установлен как Один-ко-многим.
- Поля в обоих столбцах совпадают по типу данных (например, Числовой или Короткий текст).
- Опция Обеспечение целостности данных активирована, если требуется автоматическая проверка соответствия записей.
Целостность данных гарантирует, что в связанной таблице не появится запись с несуществующим значением внешнего ключа. При её включении Access предложит выбрать дополнительные параметры:
- Каскадное обновление связанных полей – изменение первичного ключа в главной таблице автоматически обновит все связанные записи.
- Каскадное удаление связанных записей – удаление записи из главной таблицы удалит все связанные записи в подчинённой.
Используйте эти опции с осторожностью, особенно в рабочих базах.
Если связь создана неверно, удалите её через контекстное меню линии связи (правый клик → Удалить). Для редактирования дважды кликните по линии – откроется окно Изменение связей с возможностью корректировки параметров.
В сложных схемах с несколькими связями используйте функцию Макет для упорядочивания таблиц. Перетаскивайте их мышью, чтобы избежать пересечения линий связей. Для масштабирования применяйте комбинации Ctrl + колесо мыши или кнопки Увеличить/Уменьшить на панели инструментов.
После настройки связей сохраните схему (Ctrl + S). Access автоматически применит изменения к базе данных. Проверьте работоспособность связей, добавив тестовые записи в обе таблицы – в подчинённой таблице должно отображаться только допустимое значение внешнего ключа.
Для быстрого анализа связей используйте кнопку Отчёт о связях на вкладке Конструктор. Отчёт содержит список всех связей с указанием таблиц, полей и параметров целостности, что полезно для документирования структуры базы.
Проверка целостности данных после установки связи

| Тип ошибки | Код ошибки | Причина | Решение |
|---|---|---|---|
| Нарушение целостности | 3200 | Запись в дочерней таблице ссылается на несуществующий первичный ключ | Удалите или исправьте некорректную запись, либо добавьте недостающий ключ в родительскую таблицу |
| Дублирование внешнего ключа | 3022 | Попытка вставить дубликат значения в поле с уникальным индексом | Проверьте ограничения уникальности на поле внешнего ключа; при необходимости удалите дубликат |
| Нулевое значение в обязательном поле | 3162 | Попытка сохранить запись с пустым внешним ключом при запрете NULL | Заполните поле значением из родительской таблицы или измените свойства поля на «Разрешить пустые значения» |
Запустите запрос на выборку с объединением таблиц для проверки согласованности данных: SELECT Клиенты.Имя, Заказы.НомерЗаказа FROM Клиенты INNER JOIN Заказы ON Клиенты.ID = Заказы.КлиентID. Если результат содержит только связанные записи – целостность соблюдена. Для массовой проверки используйте запрос с фильтром по отсутствующим связям: SELECT Заказы.* FROM Заказы LEFT JOIN Клиенты ON Заказы.КлиентID = Клиенты.ID WHERE Клиенты.ID IS NULL. Пустой результат подтвердит корректность связей.
Использование связи в запросах и формах

Связь «один ко многим» в Access позволяет автоматически подтягивать данные из связанных таблиц в запросы без ручного сопоставления. Например, если таблица Заказы связана с таблицей Клиенты по полю ID_клиента, в запросе можно вывести не только номер заказа, но и имя клиента, его адрес и телефон одним действием. Для этого в конструкторе запросов перетащите поля из обеих таблиц в бланк, а Access сам сформирует SQL-запрос с оператором JOIN. Важно: при добавлении новых записей в подчиненную таблицу (например, Заказы) поле связи должно содержать значение из главной таблицы (Клиенты), иначе запись не сохранится.
В формах связь «один ко многим» реализуется через элемент управления Подчиненная форма. Создайте основную форму на базе главной таблицы (например, Клиенты), затем добавьте подчиненную форму, привязанную к подчиненной таблице (Заказы). Access автоматически свяжет их по ключевому полю, и при выборе клиента в основной форме отобразятся только его заказы. Для корректной работы убедитесь, что свойство Источник записей подчиненной формы содержит запрос с фильтром по полю связи, например: SELECT * FROM Заказы WHERE ID_клиента = Forms!Клиенты!ID_клиента. Это исключит отображение чужих данных.
При работе с формами избегайте циклических ссылок: если в подчиненной форме добавить поле из главной таблицы, а затем попытаться изменить его значение, Access выдаст ошибку целостности. Для сложных сценариев используйте VBA-обработчики событий, например, On Current для обновления данных в подчиненной форме при смене записи в основной. Проверяйте каскадные обновления и удаления в параметрах связи – это позволит автоматически корректировать или удалять связанные записи при изменении ключевого поля в главной таблице.
