Связь таблиц в Access
Вся информация, которую можно получить из систем управления базами данных (СУБД), собрана в разных таблицах. Это необходимо для предотвращения переизбытка информации. Выборка и последующая работа с необходимыми сведениями осуществляется с помощью механизма связывания. Именно о том, как в Access связать таблицы и пойдет речь в этой статье. Связь происходит по общему полю, для которого следует задать определенный тип данных. Изменения можно вносить как в исходную, так и в связанную таблицу – они в любом случае будут отображаться в обеих БД.
Пошаговая инструкция
- Откройте БД в программе (помните, что связать можно минимум 2 таблицы в Access).
- Заполните поля информацией, учитывая, что для осуществления операции, поля должны иметь схожий тип данных. Если созданная связь имеет формат «один ко многим», то поля в первой таблице могут иметь тип «Счетчика», а соответствующая ячейка во второй – должна быть числовой. В качестве ключевого следует задать именно счетчик.
- Откройте меню «Сервис/Схема данных» после чего на экране появится область со связанными элементами. Если же она пуста, то окно добавления таблиц откроется в Access автоматически.
- Для того чтобы включить связываемые таблицы Access в открытую БД, следует выделять необходимые названия и кликать на кнопку «Добавить». При этом изображения с табличками будут появляться в рабочей области.
- Чтобы установить связи между таблицами в Access следует захватить поле одного объекта, перенести и отпустить мышку над соответствующим полем в другом. После этого на экране появится окошко с настройками.
- Если задать точное расположение ячеек в Access с помощью мышки не удалось, их можно настроить в выпадающих списках. Включение всех «флажков» обеспечит целостность и сохранность данных, а также их каскадное изменение.
- Установленный тип отношений можно просмотреть внизу окошка. Всего их три: «1 ко многим», «к одному» и «многие ко многим». Если в окне отобразился не тот параметр, значит, типы полей были заданы неверно.
- После нажатия на кнопку «Создать» между изображениями появится линия с цифрой 1 и символом бесконечности. Это значит, что объекты Access связаны соотношением «один ко многим».
Как видите, ничего сложного в установлении связи между таблицами в Access нет. Надеемся, что наше руководство окажется полезным для вас!
Ответы на другие вопросы:
Создание, изменение и удаление отношения
Отношение в Access позволяет объединить данные из двух разных таблиц. Каждое отношение состоит из двух полей (по одному в каждой таблице) со связанными данными. Например, таблицы «Товары» и «Сведения о заказах» могут содержать поле «КодТовара». Каждая запись в таблице «Сведения о заказах» содержит значение поля «КодТовара», которому соответствует запись в таблице «Товары» с тем же значением в данном поле.
При помощи отношений между связанными таблицами приложение Access определяет, какие записи из каждой таблицы поместить в набор результатов запроса. Отношение также позволяет избежать потери данных, препятствуя исключению удаленных данных из синхронизации. Это называется целостностью данных.
Перед началом работы с отношениями изучите основные понятия. Дополнительные сведения о см. в статьях Руководство по связям между таблицами и Начало работы со связями между таблицами.
В этой статье
- Обзор
- Создание отношения между таблицами с помощью окна отношений
- Создание отношения между таблицами с помощью панели списка полей
- Изменение отношения
- Обеспечение целостности данных
- Удаление отношения между таблицами
- Создание, изменение и удаление отношения в веб-приложении
- Создание или изменение отношения в веб-базе данных Access 2010
Обзор
Чтобы создать отношение в базе данных Access, можно воспользоваться одним из указанных ниже методов.
- В окне «Схема данных» добавьте таблицы, которые требуется связать, а затем перетащите нужное поле из одной таблицы в другую.
- Перетащите поле в таблицу из области Список полей.
При создании отношения между таблицами общие поля могут называться по-разному, однако часто требуется, чтобы эти имена совпадали. Очевидно, что общие поля должны иметь одинаковый тип данных. Однако если поле первичного ключа имеет тип «Счетчик», поле внешнего ключа также может быть числовым, если свойство Размер поля (FieldSize) обоих полей совпадает. Например, можно сопоставить поля с типами «Счетчик» и «Числовой», если свойство Размер поля обоих полей имеет значение «Длинное целое». Если оба общих поля являются числовыми, у них должно совпадать значение свойства Размер поля.
Создание отношения между таблицами с помощью окна отношений
- На вкладке Работа с базами данных в группе Отношения выберите элемент Схема данных.
- На вкладке Конструктор в группе Связи нажмите наДобавление таблиц (илиДобавление таблицы в Access 2013).
- Выберите одну или несколько таблиц или запросов и нажмите кнопку Добавить. После добавления таблиц и запросов на вкладку «Схема данных» нажмите кнопку Закрыть.
- Перетащите поле (как правило, поле первичного ключа) из одной таблицы на общее поле (поле внешнего ключа) в другой таблице. Чтобы перетащить сразу несколько полей, нажмите и удерживайте клавишу CTRL, нажмите каждое поле и перетащите выделенные поля.
- Создание связи «один-к-одному» Оба общих поля (как правило, поля первичного ключа и внешнего ключа) должны иметь уникальный индекс. Это означает, что свойство Индексированное этих полей должно иметь значение Да(Совпадения не допускаются). Если оба поля имеют уникальный индекс, в Access будет создано отношение «один-к-одному».
- Создание отношения «один-ко-многим». Поле на стороне «один» (как правило, первичный ключ) отношения должно иметь уникальный индекс. Это значит, что свойство Индексированное поле должно иметь значение Да(Совпадения не допускаются). Поле на стороне «многие» не должно иметь уникального индекса. Это поле может быть индексированным, но для него должны допускаться повторы. Это означает, что свойство Индексированное поле должно иметь значение Нет или Да (Допускаются совпадения). Когда у одного поля однозначный индекс, а у другого — нет, в приложении Access создается отношение «один-ко-многим».
Создание отношения между таблицами с помощью панели списка полей
Добавить поле в существующую таблицу, открытую в режиме таблицы, можно путем перетаскивания этого поля из области Список полей. В области Список полей отображаются доступные поля из связанных таблиц, а также из других таблиц базы данных.
При перетаскивании поля из «другой» (несвязанной) таблицы и выполнении инструкций мастера подстановок между таблицей из области Список полей и таблицей, в которую перетаскивается поле, автоматически создается новое отношение «один-ко-многим». Это отношение, созданное Access, не обеспечивает целостность данных по умолчанию. Чтобы обеспечить целостность данных, нужно изменить отношение. Дополнительные сведения см. в разделе Изменение отношения.
Открытие таблицы в режиме таблицы
- Дважды щелкните таблицу в области навигации.
Открытие области «Список полей»
- Нажмите клавиши ALT+F8. Будет отображена область Список полей.
В области Список полей отображены все другие таблицы базы данных, сгруппированные по категориям. При работе с таблицей в режиме таблицы в области Список полей отображаются поля в одной из двух категорий: Доступные поля в связанной таблице и Доступные поля в другой таблице. К первой категории относятся все таблицы, связанные отношением с текущей таблицей. Во второй категории перечислены все таблицы, с которыми данная таблица не связана отношением.
Чтобы просмотреть список всех полей таблицы, щелкните знак плюс (+) рядом с именем таблицы в области Список полей. Чтобы добавить поле в таблицу, перетащите его из области Список полей в таблицу в режиме таблицы.
Добавление поля и создание связи из области «Список полей»
- Открыв таблицу в режиме таблицы, нажмите клавиши ALT+F8. Будет отображена область Список полей.
- Чтобы отобразить список полей в таблице, в группе Доступные поля в другой таблице щелкните знак плюс (+) рядом с именем таблицы.
- Перетащите нужное поле из области Список полей в таблицу, открытую в режиме таблицы.
- Когда появится линия вставки, поместите поле в выбранное место. Появится окно мастера подстановок.
- Следуйте инструкциям мастера подстановок. Поле будет отображено в таблице в режиме таблицы.
При перетаскивании поля из «другой» (несвязанной) таблицы и выполнении инструкций мастера подстановок между таблицей из области Список полей и таблицей, в которую было перетаскивается поле, автоматически создается новое отношение «один-ко-многим». Это отношение, созданное Access, не обеспечивает целостность данных по умолчанию. Чтобы обеспечить целостность данных, нужно изменить отношение. Дополнительные сведения см. в разделе Изменение отношения.
Изменение отношения
Чтобы изменить отношение, выберите его в окне «Схема данных» и внесите нужные изменения.
- Установите указатель на линию связи и щелкните линию, чтобы выделить ее. При выделении линия связи становится толще.
- Дважды щелкните выделенную линию связи ИЛИ на вкладке Конструктор в группе Сервис выберите команду Изменить связи.
Откроется диалоговое окно Изменение связей.
Открытие диалогового окна «Изменение связей»
- На вкладке Работа с базами данных в группе Отношения выберите элемент Схема данных.
- На вкладке Конструктор в группе Связи нажмите кнопку Все связи. Будут отображены все таблицы с отношениями, а также соответствующие линии связи. Обратите внимание на то, что скрытые таблицы (таблицы, для которых установлен флажок скрытый в диалоговом окне Свойства) и их отношения не отображаются, если в диалоговом окне Параметры переходов не выбран параметр «Показывать скрытые объекты».
- Щелкните линию отношения, которое вы хотите изменить. При выделении линия связи становится толще.
- Дважды щелкните линию связи. ИЛИ На вкладке Конструктор в группе Сервис выберите команду Изменить связи. Откроется диалоговое окно Изменение связей.
- Внесите изменения и нажмите кнопку ОК. В диалоговом окне Изменение связей можно изменить связи между таблицами (например, таблицы, запросы или поля на любой стороне связи). Можно также задать тип соединения или включить обеспечение целостности данных и выбрать каскадный параметр. Дополнительные сведения о типе соединения и его просмотре см. в разделе Указание типа соединения. Дополнительные сведения об обеспечении целостности данных и выборе каскадного параметра см. в разделе Обеспечение целостности данных.
Указание типа соединения
При определении отношения между таблицами сведения о нем влияют на структуру запросов. Например, при определении отношения между двумя таблицами и создании запроса, работающего с этими двумя таблицами, в Access автоматически выбираются сопоставляемые поля по умолчанию на основе полей, указанных в отношении. Эти исходные значения в запросе можно переопределить, но часто значения, определенные отношением между таблицами, являются верными. Поскольку сопоставление и объединение данных из двух таблиц являются часто воспроизводимыми действиями во всех базах данных, кроме самых простых, параметры по умолчанию, определенные отношениями между таблицами, могут быть полезны и экономить время.
С помощью запроса к нескольким таблицам можно комбинировать данные из них путем сопоставления значений в общих полях. Операция сопоставления и комбинирования называется объединением. Например, требуется отобразить заказы клиентов. Для этого создается запрос, объединяющий таблицы «Клиенты» и «Заказы» по полю «Код клиента». Результаты запроса содержат сведения о клиенте, а также другие сведения только для строк с найденным соответствующим значением.
Одно из значений, которое можно задать для каждого отношения, — это тип объединения. Тип объединения определяет, какие записи будут включены в результаты запроса. Обратимся к описанному примеру с объединением таблиц «Клиенты» и «Заказы» по общим полям, представляющим код клиента. При использовании типа объединения по умолчанию (внутреннего соединения) запрос возвращает только строки таблиц «Клиенты» и «Заказы», для которых общие поля (также называемые связанными полями) совпадают.
Предположим, что требуется включить в результаты всех клиентов — даже тех, которые еще не сделали ни одного заказа. Для этого нужно изменить тип объединения с внутреннего на так называемое левое внешнее соединение. При использовании левого внешнего соединения возвращаются все строки таблицы на левой стороне отношения и только сопоставленные строки на правой. При использовании правого внешнего соединения возвращаются все строки на правой стороне отношения и только сопоставленные — на левой.
Примечание: В этом случае термины «слева» и «справа» относятся к положению таблиц в диалоговом окне Изменение связей, а не в окне «Схема данных».
Следует определить, какие результаты наиболее часто требуются от запроса, соединяющего таблицы в конкретной связи, и в соответствии с этим выбрать тип соединения.
Указание типа соединения
- В диалоговом окне Изменение связей нажмите кнопку Тип соединения. Откроется диалоговое окно Параметры соединения.
- Выберите нужные параметры и нажмите кнопку ОК.
В таблице ниже, составленной на основании таблиц «Клиенты» и «Заказы», приведены три варианта, отображаемые в окне Параметры объединения, указан используемый в них тип объединения, а также то, какие именно строки (все или только сопоставленные) возвращаются для каждой из таблиц.
1. Объединение только тех записей, в которых связанные поля обеих таблиц совпадают.
2. Объединение ВСЕХ записей из таблицы «Клиенты» и только тех записей из таблицы «Заказы», в которых связанные поля совпадают.
Левое внешнее соединение
3. Объединение ВСЕХ записей из таблицы «Заказы» и только тех записей из таблицы «Клиенты», в которых связанные поля совпадают.
Правое внешнее соединение
При выборе варианта 2 или 3 на линии связи будет отображена стрелка, указывающая на ту сторону связи, в которой отображаются только сопоставленные строки.
Внесение изменений в окне «Параметры объединения»
- На вкладке Работа с базами данных в группе Отношения нажмите кнопку Схема данных.
- На вкладке Конструктор в группе Связи нажмите кнопку Все связи.
Обеспечение целостности данных
Целью обеспечения целостности данных является предотвращение появления непарных записей, ссылающихся на несуществующие записи. Обеспечение целостности данных включается для конкретного отношения между таблицами. В результате Access отменяет для этого отношения все действия, которые могут нарушить целостность данных. Это означает, что будет отменено как обновление, изменяющее целевой объект ссылки, так и удаление такого целевого объекта. Сведения о том, как настроить в Access распространение операций обновления и удаления таким образом, чтобы в результате изменялись и все связанные строки, см. в разделе Задание каскадных параметров.
Включение и отключение обеспечения целостности данных
- На вкладке Работа с базами данных в группе Отношения нажмите кнопку Схема данных.
- На вкладке Конструктор в группе Связи нажмите кнопку Все связи.
В режиме обеспечения целостности данных действуют перечисленные ниже правила.
- Не допускается ввод в поле внешнего ключа связанной таблицы значений, отсутствующих в поле первичного ключа главной таблицы, поскольку это приводит к появлению потерянных записей.
- Не допускается удаление записи из главной таблицы, если в связанной таблице существуют связанные с ней записи. Например, невозможно удалить запись из таблицы «Сотрудники», если в таблице «Заказы» имеются заказы, относящиеся к данному сотруднику. Однако можно удалить главную запись и все связанные записи одним действием, установив флажок Каскадное удаление связанных записей.
- Не допускается изменение значения первичного ключа в главной таблице, если это приведет к появлению потерянных записей. Например, нельзя изменить номер заказа в таблице «Заказы», если в таблице «Сведения о заказах» имеются строки, относящиеся к этому заказу. Однако можно обновить главную запись и все связанные записи одним действием, установив флажок «Каскадное обновление связанных полей».
- Общее поле главной таблицы должно быть первичным ключом или иметь уникальный индекс.
- Общие поля должны иметь одинаковый тип данных. Единственное исключение — поле типа «Счетчик» можно связать с полем типа «Числовой», если его свойство Размер поля имеет значение Длинное целое.
- Обе таблицы существуют в одной базе данных Access. Обеспечение целостности данных нельзя включить для присоединенных таблиц. Однако если исходные таблицы имеют формат Access, можно открыть базу данных, в которой они хранятся, и включить обеспечение целостности данных в этой базе.
Задание каскадных параметров
Иногда возникает ситуация, в которой требуется изменить значение только на стороне «один» отношения. В этом случае необходимо, чтобы Access автоматически обновил все затронутые строки в ходе выполнения одной операции. Тогда обновление будет полностью завершено, а база данных не будет находиться в несогласованном состоянии, когда некоторые строки обновлены, а другие — нет. Этой проблемы можно избежать с помощью параметра Access «Каскадное обновление связанных полей». Если при включении обеспечения целостности данных был включен параметр «Каскадное обновление связанных полей», то при последующем обновлении первичного ключа автоматически будут обновлены все связанные с ним поля.
Также может потребоваться удаление строки и всех связанных с ней записей — например, записи в таблице «Поставщики» и всех связанных с этим поставщиком заказов. Для этого в Access предназначен параметр «Каскадное удаление связанных записей». Если включить обеспечение целостности данных и установить флажок Каскадное удаление связанных записей, при удалении записи, содержащей первичный ключ, будут автоматически удалены все записи, связанные с этим первичным ключом.
Включение и отключение каскадного обновления и каскадного удаления
- На вкладке Работа с базами данных в группе Отношения нажмите кнопку Схема данных.
- На вкладке Конструктор в группе Связи нажмите кнопку Все связи.
Примечание: Если первичным ключом является поле «Счетчик», установка флажка Каскадное обновление связанных полей не произведет никакого эффекта, поскольку изменить значение поля «Счетчик» нельзя.
Удаление отношения между таблицами
Важно: При удалении связи также отключается обеспечение целостности данных для этой связи, если оно было включено. В результате Access больше не будет автоматически предотвращать появление потерянных записей на стороне «многие» отношения.
Чтобы удалить отношение между таблицами, нужно удалить линию связи в окне «Схема данных». Установите указатель мыши на линию связи и щелкните ее. При выделении линия связи становится толще. Выделив линию связи, нажмите клавишу DEL.
- На вкладке Работа с базами данных в группе Отношения нажмите кнопку Схема данных.
- На вкладке Конструктор в группе Связи нажмите кнопку Все связи.
Примечание: Если одна из таблиц, участвующих в отношении, в данный момент используется (возможно, третьим лицом, процессом либо в открытом объекте базы данных, например в форме), удалить отношение между таблицами будет невозможно. Перед попыткой удаления отношения между таблицами закройте все открытые объекты, использующие эти таблицы.
Создание, изменение и удаление отношения в веб-приложении Access
Существуют важные отличия при работе со связями в веб-приложении Access.
Создание отношения
В веб-приложении Access отсутствует окно «Схема данных». Вместо связи необходимо создать поле подстановки, которое получает значения из связанного поля в другой таблице. Например, предположим, что у вас есть таблица «Сотрудники» и вы хотите добавить подстановку на таблицу «Регионы», чтобы показывать регионы, в которых работают сотрудники.
Примечание: Поле, используемое в качестве источника для подстановки, должно существовать перед созданием поля подстановки.
Вот как можно создать поле подстановки в веб-приложении Access:
- Откройте таблицу, в которой вы хотите создать поле подстановки, дважды щелкнув ее в области навигации. (Совет: вам может понадобиться выбрать Главная >Область навигации для просмотра доступных таблиц.) Как указано в примере выше, щелкните таблицу Сотрудники.
- Щелкните столбец Имя поля под последним полем в таблице и введите имя для нового поля подстановки. В этом примере введите имя Регион.
- В столбце Тип данных щелкните стрелку и выберите значение Подстановка.
Появится окно мастера подстановок.
- На первой странице мастера подстановок выберите Получать значения из другой таблицы или запроса для поля подстановки. В диалоговом окне появятся дополнительные параметры.
- Выберите имя таблицы или запроса, которые будут предоставлять значения для подстановки. В этом примере выберите Таблица: Регионы.
(Имена таблиц на изображении соответствуют используемому примеру.)
- После выбора таблицы укажите в списке Выберите значение, которое должно отображаться в поле подстановки поле, которое вы хотите использовать в качестве отображаемого значения для поля подстановки. По умолчанию Access выбирает первое текстовое поле, обнаруженное в выбранной таблице. В этом примере в качестве отображаемого значения следует оставить выбранное поле (Название).
- При необходимости настройте сортировку с помощью списка Отсортировать элементы в поле подстановки?.
- В разделе Какое действие должно выполняться при удалении записи из таблицы «Регионы»? выберите тип связи между двумя таблицами и укажите, нужно ли обеспечивать целостность данных. (Имя таблицы в этом вопросе меняется в зависимости от того, какая таблица была выбрана на этапе 5.) По умолчанию мастер подстановок использует значение Запретить удаление, если существуют соответствующие записи в таблице «Сотрудники», так как в большинстве случаев это самый безопасный вариант. В этом примере данный параметр означает, что из таблицы «Регионы» невозможно удалить значение, если оно используется в записях таблицы «Сотрудники». Таким образом, если в записях сотрудников указан регион «Запад» и вы пытаетесь удалить его из таблицы «Регионы», Access предотвратит это. В таком случае вам потребуется заменить значение «Запад» во всех записях сотрудников на что-то еще, прежде чем удалять его из таблицы «Регионы». В данном примере может подойти последний вариант, позволяющий удалить значение «Запад» из таблицы «Регионы». При этом значение «Запад» будет автоматически удалено из записей сотрудников, а вместо него останутся пустые значения. При выборе второго варианта будут удалены все записи сотрудников с регионом «Запад» из таблицы «Сотрудники». Это так называемое каскадное удаление приведет к удалению намного большего объема данных, чем требуется в примере. Будьте внимательны при выборе этого параметра.
Изменение отношения
В веб-приложении Access отсутствует окно «Схема данных». Поле в одной таблице служит источником (полем подстановки) значений для связанного поля в другой таблице.
- Откройте таблицу, содержащую подстановку, которое нужно изменить, выбрав команду Изменить таблицу.
- Выберите поле, в которое подставляются значения из другой таблицы.
- На вкладке Конструктор в группе Работа с таблицами нажмите кнопку Изменить подстановки.
- Внесите нужные изменения в соответствии с инструкциями мастера. Можно изменить следующие элементы.
- Поле-источник значений
- Порядок сортировки значений
- Ширину поля и отображение ключевого столбца
- Подпись поля подстановки
- Включение проверки целостности данных
- Каскадное или ограниченное удаление в случае, если включена проверка целостности данных
Удаление отношения
В веб-приложении Access отсутствует окно «Схема данных». Поле в одной таблице служит источником (полем подстановки) значений для связанного поля в другой таблице. Чтобы удалить связь между двумя таблицами в веб-приложении Access, необходимо удалить поле подстановки и связанные с ним данные.
- Откройте таблицу, содержащую поле подстановки, которое нужно удалить, выбрав команду Изменить таблицу.
- Выберите поле подстановки, в которое подставляются значения из другой таблицы веб-приложения.
- На вкладке Конструктор в разделе Работа с таблицами нажмите кнопку Удалить поля.
- В Access отображается сообщение Удалить выделенные поля и все содержащиеся в них данные? Нажмите кнопку Да, чтобы подтвердить удаление поля подстановки и его данных.
Примечание: При удалении поля подстановки приложение Access также может предложить вам удалить один или несколько индексов. Если такое сообщение появляется, нажмите кнопку Да.
Создание или изменение отношения в веб-базе данных Access 2010
Чтобы создать отношение в веб-базе данных Access 2010, необходимо использовать мастер подстановок. Окно «Схема данных» отсутствует в веб-базе данных. Поле в одной таблице используется в качестве источника для значения в связанном поле другой таблицы.
Примечание: Воспользоваться мастером подстановок можно только при наличии поля, используемого в качестве источника значений.
Создание в веб-базе данных Access 2010 отношения с помощью мастера подстановок
- Откройте таблицу, в которую будут переноситься значения из другой таблицы.
- Справа от последнего поля нажмите кнопку Щелкните для добавления, а затем выберите пункт Подстановка и отношение.
Примечание: Для отображения кнопки Щелкните для добавления, может понадобиться прокрутить страницу по горизонтали.
- Каскадное удаление позволяет при удалении записи в одной таблице удалять соответствующую запись в другой.
- Ограниченное удаление не разрешает удалить запись из таблицы, если она связана с записью в другой таблице.
Примечание: Не выбирайте элемент Разрешить несколько значений в мастере подстановок, если он используется для создания отношения.
Изменение отношения в веб-базе данных Access 2010
- Откройте таблицу, в которую подставляются значения из другой таблицы.
- Выберите поле, в которое подставляются значения из другой таблицы.
- На вкладке Поля в группе Свойства нажмите кнопку Изменить подстановки.
- Внесите нужные изменения в соответствии с инструкциями мастера. Можно изменить следующие элементы.
- Поле-источник значений
- Порядок сортировки значений
- Ширину поля и отображение ключевого столбца
- Подпись поля подстановки
- Включение проверки целостности данных
- Каскадное или ограниченное удаление в случае, если включена проверка целостности данных
Как установить связи между таблицами
Цель изучения темы: научиться выбирать ключевые поля для таблиц, освоить методику установки связей между таблицами и осуществлять их корректировку.
Access 2010 даёт возможность организовывать и отображать межтабличные связи двумя способами: непосредственно связей между таблицами и создание вложенных таблиц данных. В Access 2010 система самостоятельно устанавливает связи между таблицами, если в таблицах уже установлены ключевые поля.
Для создания связей необходимо установить соответствие величин одной таблицы величинам из другой таблицы. Связи устанавливаются через определяемые пользователем поля. Для этого связывают ключевое поле родительской таблицы (внешний ключ) с соответствующим ему полем дочерней таблицы. Эти поля в таблицах часто имеют одинаковые имена, но в общем случае это не обязательно. Строго обязательными являются следующие условия.
Ø В одной или в обеих таблицах должно быть поле, содержащее уникальные (не имеющие повторений) значения во всех записях, это и есть первичный ключ.
Ø Связываемые поля должны иметь одинаковые типы данных, кроме исключений из этого правила:
· Поле Счётчика (Код) разрешается связывать с Числовым полем, если в числовом поле в свойствах Размер поля задано значение Длинное целое ( Long Integer );
· Поле Счётчика (Код) разрешается связывать с Числовым полем, если для обоих полей в свойстве Размер поля задано значение Код репликации ( Replication ID – идентификатор связи).
Ø Связываемые поля Числового типа должны иметь одинаковые значения свойства Размер поля.
Ø Для полей, содержащие данные типа OLE и MEMO , первичный ключ назначить невозможно.
В сбалансированной структуре реляционной базы данных каждая запись в любой таблице должна уникально идентифицироваться, т.е. значения некоторых полей в таблице не должны повторяться во всём множестве записей. Этот уникальный идентификатор называется первичным ключом . Как вы заметили, после создания таблиц в Access 2010 в режиме Конструктор, при выполнении операций «Закрыть» или «Сохранить», система делает напоминание:
. В том случае, если нажать на кнопку «Нет», то ключевого поля система создавать не будет (в рассмотренных примерах дано объяснение, почему удобнее ключ устанавливать позже). При создании таблицы в режиме Таблица, система автоматически создаёт первое поле, которое называется «Код» с типом данных «Счётчик». Это поле является ключевым, например, на рисунке 60 показан вариант создаваемой таблицы вручную, при вводе данных в поле «Стаж…» система автоматически в поле «Код» устанавливает порядковые номера записей, а после закрытия таблицы поле «Код» становится ключевым.
Рис. 60. Пример созданной таблицы в режиме Таблица
В том случае, если ключевое поле не было установлено в таблице, то понадобится установить ключ самостоятельно (в рассматриваемых примерах, для таблиц «Личные сведения» и «Доплаты» ключи не устанавливались). Для добавления первичного ключа к таблице или для его удаления, необходимо таблицу открыть в режиме Конструктор. Рассмотрим на примере правила создания первичного ключа.
1. Откройте в режиме Конструктор таблицу «Личные сведения».
2. Выделите строку с наименованием поля «Фамилия».
3. На вкладке «Работа с таблицами» щёлкните по надписи .
4. Сохраните таблицу.
Понятно, что убрать ключ из таблицы можно выполнив те же действия. Проверьте, существуют ли ключи в других таблицах, которые были созданы на предыдущих этапах («Надбавка за стаж», «Номенклатура должностей» и «Доплаты»). Если в режиме Конструктор попытаться открыть таблицу, , которая является связанной с внешним файлом, то система выдаст сообщение, текст которого представлен на рисунке 61.
Рис. 61. Сообщение системы о том, что даненая таблица является связанной
1. Может ли Access 2010 самостоятельно устанавливать связи между таблицами, при каких условиях это происходит?
2. Для чего необходимо устанавливать первичный ключ в таблице?
3. Каким типам полей не удаётся установить первичный ключ?
4. Можно ли полю с типом данных Текстовый назначать первичный ключ?
5. Как понимать термин «Уникальное значение записей»?
6. В каких случаях Access 2010 самостоятельно создаёт ключевое поле?
7. Что необходимо сделать, чтобы переназначить ключевое поле в таблице?
Для отображения, корректировки и удаления связей между таблицами в Access предложено прекрасное визуальное средство – Схема данных. Для того, чтобы увидеть, какие связи между таблицами существуют, достаточно закрыть все таблицы, активизировать вкладку «Работа с базами данных», а затем нажать на пиктограмму «Схема данных», которая показана в начале раздела слева. Часто разработчик базы данных изменяет наименования ключевых полей, что потребует от него проведения операции создания связи вручную или её удаление. В некоторых версиях Access 2010 система не создаёт связей. Поэтому, полезно ознакомиться с последовательностью установления связей вручную.
1. Закройте все таблицы в базе данных.
2. Выделите одну из таблиц, например, «Доплаты», при этом появится вкладка «Работа со связями».
3. Щёлкните по пиктограмме , будет открыто окно для добавления таблиц при создании схемы данных. Нажмите на кнопку
. Обратите внимание, что ещё имеются способы добавления таблицы на поле «Схема данных». Например, можно в области переходов ухватить левой клавишей мыши нужную таблицу, а затем перетащить её в поле «Схема данных», либо на поле «Схема данных» щёлкнуть правой кнопкой мыши, а затем выбрать из списка
. На рисунке 62 представлен пример добавления таблицы «Личные сведения» на поле «Схема данных» методом выбора из списка. Как видите, связи можно устанавливать не только с таблицами, а и с запросами, которые на выходе формируют новые таблицы (о создании запросов будет сказано ниже). Добавьте на поле «Схема данных» таблицы, которые были созданы ранее.
Рис. 62. Пример добавления таблиц на поле «Схема данных»
4. Добавьте все таблицы, созданные ранее, на поле «Схема связей». Проведите операцию установление связей между таблицами «Доплаты» (родительская таблица) и «Личные сведения» (Дочерняя таблица). Для выполнения установления связей левой кнопкой мыши выделите в таблице «Доплаты» поле , а затем переместите указатель мыши на поле
таблицы «Личные сведения», когда освободите указатель мыши, появится окно «Изменение связей» (Рис. 63).
Рис. 63. Окно для установления параметров связей между таблицами
5. В окне «Изменение связей» указано откуда и куда проложена связь, если типы данных соединяемых полей совпадают (выполняются правила создания связей), то в поле «Тип отношения» появится сообщение: Один-ко-многим. Обязательно установите отметку в поле , тогда в окне «Схема данных» появится связь. На одном конце будет стоять единица (эти данные являются уникальными, а на другом конце связи будет стоять знак
— много). Желательно сделать пометки и в остальных полях, тогда при внесении коррекций в исходную таблицу в записи или их удаление, в запросах произойдёт автоматическое изменение результатов. Нажмите на кнопку
.
Почему при устанвлении связей между таблицами не обязательно ставить пометки в полях «Каскадное обновление связанных полей» и «Каскадное удаление связанных полей»? Это естественный вопрос, тем не менее, обратите внимание, если использовать в качестве связываемых полей поле «Счётчик», то это поле невозможно видоизменить пользователем, следовательно, нет смысла ставить в этом случае пометку (напомним, что при установлении ключевого поля «Текстовое», пользователь имеет возможность видоизменять данные в этом поле, например заменить фамилию.). «Каскадное удаление связанных записей» используется для того, чтобы при удалении записи из одной таблицы, в запросах или других связанных таблицах, данные помеченного поля так же будут удаляться.
1. Что следует сделать, чтобы создать схему связей между таблицами?
2. Какими способами можно добавить таблицу на поле схемы данных?
3. Для чего используется окно «Изменение связей»?
4. Для чего ставится пометка в окне «Щбеспечение целостности данных»?
При попытке создать связь между таблицами «Надбавки за стаж» и «Личные сведения» ничего не получится. Ответ ясен, в таблице «Личные сведения» отсутствует поле, которое можно связать с таблицей «Надбавки за стаж». Выходов из положения два. Первый способ – создать поле в таблице «Личные сведения», например, используя приём связанных таблиц, а затем из списка выбрать необходимые данные для заполнения вновь созданного поля. Второй способ – воспользоваться промежуточной таблицей, например, которая будет создана в запросе, этот приём довольно трудоёмкий, но позволяет наращивать базу данных новыми таблицами, а затем использовать их для выполнения вычислений в запросах (этот способ будет рассмотрен ниже). Создадим в таблице «Личные сведения» новое поле, например, «Стаж». Создание вложенных таблиц уже обсуждалось. Напомним, что сначала необходимо определить место нового поля в таблице, затем выбрать режим , далее —
, а затем выполнить шаги по подстановки необходимого поля в виде списка из другой таблицы. В результате выполняемых действий будет получена связь между таблицами «Надбавка за стаж» (Родительская) и «Личные сведения» (Дочерняя). На рисунке 64 показан пример автоматического установления связей между таблицами, когда используется метод вложения таблиц. Когда будет раскрыта таблица «Надбавки за стаж», то в ней появляется символ
. Если щёлкнуть по символу
, то будут отображены строки (записи) из дочерней таблицы (в данном примере показаны записи со сведениями о сотрудниках, которые имеют стаж работы от 1 года до 3-х лет).
Рис. 64. Пример установления связей между таблицами методом вложенния таблиц
Автоматически созданная связь отображает отношение «Один ко многим», действительно, в таблице «Надбавки за стаж» каждая строка является уникальной, в то время как в таблице «Личные сведения» данные о стаже работы сотрудника могут относиться к нескольким строкам.
Для того, чтобы увидеть, какие связи между таблицами существуют, достаточно закрыть все таблицы, активизировать вкладку «Работа с базами данных», а затем нажать на пиктограмму «Схема данных». Часто разработчик базы данных изменяет наименования ключевых полей, что потребует от него проведения операции создания связи вручную или её удаление. На рисунке 65 показана схема связей для рассматриваемого примера.
Рис. 65. Вариант сформированных связей между таблицами в базе данных
1. Каки образом можно удалить имеющуюся связь между таблицами?
2. Что обозначает символ в таблице, которая открыта в режиме Таблица?
3. Что обозначает символ на линии связи между таблицами в окне «Схема связей»?
4. Можно ли в таблице изменять значение в поле «Счётчик»?
Связи между таблицами базы данных
Связи — это довольна важная тема, которую следует понимать при проектировании баз данных. По своему личному опыту скажу, что осознав связи, мне намного легче далось понимание нормализации базы данных.
1.1. Для кого эта статья?
Эта статья будет полезна тем, кто хочет разобраться со связями между таблицами базы данных. В ней я постарался рассказать на понятном языке, что это такое. Для лучшего понимания темы, я чередую теоретический материал с практическими примерами, представленными в виде диаграммы и запроса, создающего нужные нам таблицы. Я использую СУБД Microsoft SQL Server и запросы пишу на T-SQL. Написанный мною код должен работать и на других СУБД, поскольку запросы являются универсальными и не используют специфических конструкций языка T-SQL.
1.2. Как вы можете применить эти знания?
- Процесс создания баз данных станет для вас легче и понятнее.
- Понимание связей между таблицами поможет вам легче освоить нормализацию, что является очень важным при проектировании базы данных.
- Разобраться с чужой базой данных будет значительно проще.
- На собеседовании это будет очень хорошим плюсом.
2. Благодарности
Учтены были советы и критика авторов jobgemws, unfilled, firnind, Hamaruba.
Спасибо!
3.1. Как организовываются связи?
Связи создаются с помощью внешних ключей (foreign key).
Внешний ключ — это атрибут или набор атрибутов, которые ссылаются на primary key или unique другой таблицы. Другими словами, это что-то вроде указателя на строку другой таблицы.
3.2. Виды связей
Связи делятся на:
- Многие ко многим.
- Один ко многим.
- с обязательной связью;
- с необязательной связью;
- Один к одному.
- с обязательной связью;
- с необязательной связью;
4. Многие ко многим
Представим, что нам нужно написать БД, которая будет хранить работником IT-компании. При этом существует некий стандартный набор должностей. При этом:
- Работник может иметь одну и более должностей. Например, некий работник может быть и админом, и программистом.
- Должность может «владеть» одним и более работников. Например, админами является определенный набор работников. Другими словами, к админам относятся некие работники.
4.1. Как построить такие таблицы?
Мы уже имеем две таблицы, описывающие работника и профессию. Теперь нам нужно установить между ними связь многие ко многим. Для реализации такой связи нам нужен некий посредник между таблицами «Employee» и «Position». В нашем случае это будет некая таблица «EmployeesPositions» (работники и должности). Эта таблица-посредник связывает между собой работника и должность следующим образом:
EmployeeId | PositionId |
---|---|
1 | 1 |
1 | 2 |
2 | 3 |
3 | 3 |
Слева указаны работники (их id), справа — должности (их id). Работники и должности на этой таблице указываются с помощью id’шников.
На эту таблицу можно посмотреть с двух сторон:
- Таким образом, мы говорим, что работник с id 1 находится на должность с id 1. При этом обратите внимание на то, что в этой таблице работник с id 1 имеет две должности: 1 и 2. Т.е., каждому работнику слева соответствует некая должность справа.
- Мы также можем сказать, что должности с id 3 принадлежат пользователи с id 2 и 3. Т.е., каждой роли справа принадлежит некий работник слева.
4.2. Реализация
Диаграмма
Код на T-SQL
create table dbo.Employee ( EmployeeId int primary key, EmployeeName nvarchar(128) not null, EmployeeAge int not null ) -- Заполним таблицу Employee данными. insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (1, N'John Smith', 22) insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (2, N'Hilary White', 22) insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (3, N'Emily Brown', 22) create table dbo.Position ( PositionId int primary key, PositionName nvarchar(64) not null ) -- Заполним таблицу Position данными. insert into dbo.Position(PositionId, PositionName) values(1, N'IT-director') insert into dbo.Position(PositionId, PositionName) values(2, N'Programmer') insert into dbo.Position(PositionId, PositionName) values(3, N'Engineer') -- Заполним таблицу EmployeesPositions данными. create table dbo.EmployeesPositions ( PositionId int foreign key references dbo.Position(PositionId), EmployeeId int foreign key references dbo.Employee(EmployeeId), primary key(PositionId, EmployeeId) ) insert into dbo.EmployeesPositions(EmployeeId, PositionId) values (1, 1) insert into dbo.EmployeesPositions(EmployeeId, PositionId) values (1, 2) insert into dbo.EmployeesPositions(EmployeeId, PositionId) values (2, 3) insert into dbo.EmployeesPositions(EmployeeId, PositionId) values (3, 3)
Объяснения
С помощью ограничения foreign key мы можем ссылаться на primary key или unique другой таблицы. В этом примере мы
- ссылаемся атрибутом PositionId таблицы EmployeesPositions на атрибут PositionId таблицы Position;
- атрибутом EmployeeId таблицы EmployeesPositions — на атрибут EmployeeId таблицы Employee;
4.3. Вывод
Для реализации связи многие ко многим нам нужен некий посредник между двумя рассматриваемыми таблицами. Он должен хранить два внешних ключа, первый из которых ссылается на первую таблицу, а второй — на вторую.
5. Один ко многим
Эта самая распространенная связь между базами данных. Мы рассматриваем ее после связи многие ко многим для сравнения.
Предположим, нам нужно реализовать некую БД, которая ведет учет данных о пользователях. У пользователя есть: имя, фамилия, возраст, номера телефонов. При этом у каждого пользователя может быть от одного и больше номеров телефонов (многие номера телефонов).
В этом случае мы наблюдаем следующее: пользователь может иметь многие номера телефонов, но нельзя сказать, что номеру телефона принадлежит определенный пользователь.
Другими словами, телефон принадлежит только одному пользователю. А пользователю могут принадлежать 1 и более телефонов (многие).
Как мы видим, это отношение один ко многим.
5.1. Как построить такие таблицы?
Пользователей будет представлять некая таблица «Person» (id, имя, фамилия, возраст), номера телефонов будет представлять таблица «Phone». Она будет выглядеть так:
PhoneId | PersonId | PhoneNumber |
---|---|---|
1 | 5 | 11 091-10 |
2 | 5 | 19 124-66 |
3 | 17 | 21 972-02 |
Данная таблица представляет три номера телефона. При этом номера телефона с id 1 и 2 принадлежат пользователю с id 5. А вот номер с id 3 принадлежит пользователю с id 17.
Заметка. Если бы у таблицы «Phones» было бы больше атрибутов, то мы смело бы их добавляли в эту таблицу.
5.2. Почему мы не делаем тут таблицу-посредника?
Таблица-посредник нужна только в том случае, если мы имеем связь многие-ко-многим. По той простой причине, что мы можем рассматривать ее с двух сторон. Как, например, таблицу EmployeesPositions ранее:
- Каждому работнику принадлежат несколько должностей (многие).
- Каждой должности принадлежит несколько работников (многие).
5.3. Реализация
Диаграмма
Код на T-SQL
create table dbo.Person ( PersonId int primary key, FirstName nvarchar(64) not null, LastName nvarchar(64) not null, PersonAge int not null ) insert into dbo.Person(PersonId, FirstName, LastName, PersonAge) values (5, N'John', N'Doe', 25) insert into dbo.Person(PersonId, FirstName, LastName, PersonAge) values (17, N'Izabella', N'MacMillan', 19) create table dbo.Phone ( PhoneId int primary key, PersonId int foreign key references dbo.Person(PersonId), PhoneNumber varchar(64) not null ) insert into dbo.Phone(PhoneId, PersonId, PhoneNumber) values (1, 5, '11 091-10') insert into dbo.Phone(PhoneId, PersonId, PhoneNumber) values (2, 5, '19 124-66') insert into dbo.Phone(PhoneId, PersonId, PhoneNumber) values (3, 17, '21 972-02')
Объяснения
Наша таблица Phone хранит всего один внешний ключ. Он ссылается на некого пользователя (на строку из таблицы Person). Таким образом, мы как бы говорим: «этот пользователь является владельцем данного телефона». Другими словами, телефон знает id своего владельца.
6. Один к одному
Представим, что на работе вам дали задание написать БД для учета всех работников для HR. Начальник уверял, что компании нужно знать только об имени, возрасте и телефоне работника. Вы разработали такую БД и поместили в нее всю 1000 работников компании. И тут начальник говорит, что им зачем-то нужно знать о том, является ли работник инвалидом или нет. Наиболее простое, что приходит в голову — это добавить новый столбец типа bool в вашу таблицу. Но это слишком долго вписывать 1000 значений и ведь true вы будете вписывать намного реже, чем false (2% будут true, например).
Более простым решением будет создать новую таблицу, назовем ее «DisabledEmployee». Она будет выглядеть так:
DisabledPersonId | EmployeeId |
---|---|
1 | 159 |
2 | 722 |
3 | 937 |
Но это еще не связь один к одному. Дело в том, что в такую таблицу работник может быть вписан более одного раза, соответственно, мы получили отношение один ко многим: работник может быть несколько раз инвалидом. Нужно сделать так, чтобы работник мог быть вписан в таблицу только один раз, соответственно, мог быть инвалидом только один раз. Для этого нам нужно указать, что столбец EmployeeId может хранить только уникальные значения. Нам нужно просто наложить на столбец EmloyeeId ограничение unique. Это ограничение сообщает, что атрибут может принимать только уникальные значения.
Выполнив это мы получили связь один к одному.
Заметка. Обратите внимание на то, что мы могли также наложить на атрибут EmloyeeId ограничение primary key. Оно отличается от ограничения unique лишь тем, что не может принимать значения null.
6.1. Вывод
Можно сказать, что отношение один к одному — это разделение одной и той же таблицы на две.
6.2. Реализация
Диаграмма
Код на T-SQL
create table dbo.Employee ( EmployeeId int primary key, EmployeeName nvarchar(128) not null, EmployeeAge int not null ) insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (159, N'John Smith', 22) insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (722, N'Hilary White', 29) insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (937, N'Emily Brown', 19) insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (100, N'Frederic Miller', 16) insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (99, N'Henry Lorens', 20) insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (189, N'Bob Red', 25) create table dbo.DisabledEmployee ( DisabledPersonId int primary key, EmployeeId int unique foreign key references dbo.Employee(EmployeeId) ) insert into dbo.DisabledEmployee(DisabledPersonId, EmployeeId) values (1, 159) insert into dbo.DisabledEmployee(DisabledPersonId, EmployeeId) values (2, 722) insert into dbo.DisabledEmployee(DisabledPersonId, EmployeeId) values (3, 937)
Объяснения
Таблица DisabledEmployee имеет атрибут EmployeeId, что является внешним ключом. Он ссылается на атрибут EmployeeId таблицы Employee. Кроме того, этот атрибут имеет ограничение unique, что говорит о том, что в него могут быть записаны только уникальные значения. Соответственно, работник может быть записан в эту таблицу не более одного раза.
7. Обязательные и необязательные связи
Связи можно поделить на обязательные и необязательные.
7.1. Один ко многим
- Один ко многим с обязательной связью:
К одному полку относятся многие бойцы. Один боец относится только к одному полку. Обратите внимание, что любой солдат обязательно принадлежит к одному полку, а полк не может существовать без солдат. - Один ко многим с необязательной связью:
На планете Земля живут все люди. Каждый человек живет только на Земле. При этом планета может существовать и без человечества. Соответственно, нахождение нас на Земле не является обязательным
У одной биологической матери может быть много детей. У ребенка есть только одна биологическая мать.
А) У женщины необязательно есть свои дети. Соответственно, связь необязательна.
Б) У ребенка обязательно есть только одна биологическая мать – в таком случае, связь обязательна.
7.2. Один к одному
- Один к одному с обязательной связью:
У одного гражданина определенной страны обязательно есть только один паспорт этой страны. У одного паспорта есть только один владелец. - Один к одному с необязательной связью:
У одной страны может быть только одна конституция. Одна конституция принадлежит только одной стране. Но конституция не является обязательной. У страны она может быть, а может и не быть, как, например, у Израиля и Великобритании.
У одного человека может быть только один загранпаспорт. У одного загранпаспорта есть только один владелец.
А) Наличие загранпаспорта необязательно – его может и не быть у гражданина. Это необязательная связь.
Б) У загранпаспорта обязательно есть только один владелец. В этом случае, это уже обязательная связь.
7.3. Многие ко многим
Любая связь многие ко многим является необязательной. Например:
Человек может инвестировать в акции разных компаний (многих). Инвесторами какой-то компании являются определенные люди (многие).
А) Человек может вообще не инвестировать свои деньги в акции.
Б) Акции компании мог никто не купить.
8. Как читать диаграммы?
Выше я приводил диаграммы созданных нами таблиц. Но для того, чтобы их понимать, нужно знать, как их «читать». Разберемся в этом на примере диаграммы из пункта 5.3.
Мы видим отношение один ко многим. Одной персоне принадлежит много телефонов.
- Возле таблицы Person находится золотой ключик. Он обозначает слово «один».
- Возле таблицы Phone находится знак бесконечности. Он обозначает слово «многие».
9. Итоги
- Связи бывают:
- Многие ко многим.
- Один ко многим.
1) с обязательной связью;
2) с необязательной связью. - Один к одному.
1) с обязательной связью;
2) с необязательной связью.
- Связи организовываются с помощью внешних ключей.
- Foreign key (внешний ключ) — это атрибут или набор атрибутов, которые ссылаются на primary key или unique другой таблицы. Другими словами, это что-то вроде указателя на строку другой таблицы.
10. Задачи
Для лучшего усвоения материала предлагаю вам решить следующие задачи:
- Описать таблицу фильм: id, название, длительность, режиссер, жанр фильма. Обратите внимание на то, что у фильма может быть более одного жанра, а к одному жанру может относится более, чем один фильм.
- Описать таблицу песня: id, название, длительность, певец. При этом у песни может быть более одного певца, а певец мог записать более одной песни.
- Реализовать таблицу машина: модель, производитель, цвет, цена
- Описать отдельную таблицу производитель: id, название, рейтинг.
- Описать отдельную таблицу цвета: id, название.
У одной машины может быть только один производитель, а у производителя — много машин. У одной машины может быть много цветов, а у одного цвета может быть много машин.
- Добавить в БД из пункта 6.2. таблицу военно-обязанных по типу того, как мы описали отдельную таблицу DisabledEmployee.
- SQL
- Microsoft SQL Server