Как создать связи в sql
Перейти к содержимому

Как создать связи в sql

  • автор:

Online Documentation for SQL Manager for SQL server

SQL Manager for SQL Server позволяет создавать связи между таблицами — внешние ключи — в окне диаграммы. Для этого на панели инструментов окна диаграммы надо нажать кнопку Create relation .

Теперь, чтобы установить связь между двумя таблицами нужно нажать мышкой на каждой из них. После этого откроется редактор внешних ключей, в котором Вы сможете задать все свойства создаваемой связи.

VDBD - Creating relations - Context menu

Связь между таблицами отображается в виде соединительной линии.

Управление связью осуществляется с помощью контекстного меню, которое открывается при нажатии правой кнопкой мыши на связь.

С помощью этого меню Вы можете:

  • открыть связь в редакторе внешних ключей — Edit Foreign Key «имя_объекта» ,
  • удалить связь Drop Foreign Key «имя_объекта» .

При создании связи с помощью кнопки Create relation на панели инструментов диаграммы выбранные поля автоматически заносятся в редактор внешних ключей.

Как создать связи в sql

Скачай курс
в приложении

Перейти в приложение
Открыть мобильную версию сайта

© 2013 — 2023. Stepik

Наши условия использования и конфиденциальности

Get it on Google Play

Public user contributions licensed under cc-wiki license with attribution required

sql и связи между таблицами (решено)

Вот в Access-е можно в графическом режиме редактировать связи между таблицами ( создать, удалить). А вот у меня, допустим есть доступ к БД только через строку запроса, никаких окошечек и рюшечек.
Правильно ли я понимаю, что в языке SQL вот те межтабличные связи, которые я редактировал, отражаются в упоминании оператора JOIN и имени таблицы? Т.е. мы не создаём межтабличные связи при создании структуры БД, а просто в нужных запросах упоминаем JOIN + нужную таблицу?

  • Developer_A
  • Постоялец

#1
9:08, 16 сен 2013

whatson
Есть внешние ключи, которые могут ссылаться на другие ключи других таблиц.

#2
9:46, 16 сен 2013

Я пытаюсь выполнить запрос:
CREATE TABLE IF NOT EXISTS Peoples (id INTEGER PRIMARY KEY, F VARCHAR, I VARCHAR, O VARCHAR, paspSN INTEGER NOT NULL FOREIGN KEY REFERENCES Passports)
И он мне говорит:
«near «FOREIGN»: syntax error Unable to execute statement»

До этого я создаю таблицу Passports:
CREATE TABLE IF NOT EXISTS Passports (sn INTEGER NOT NULL PRIMARY KEY, organiz VARCHAR)

Что не так в создании внешнего ключа?

Создание модели

Главное окно программы

На этом экране можно создавать таблицы, добавлять отображения, SQL-скрипты и т.п.

Нас сейчас интересует возможность создания EER-диаграмм.

Задание названия БД

При двойном клике на название схемы данных

откроется окно свойств.

В нем можно задать название схемы, указать кодировку по умолчанию, и добавить комментарий.

Далее используется название по умолчанию mydb , однако при самостоятельном выполнении настоятельно рекомендуется указать осмысленное название схемы.

Создание новой диаграммы

В верхней части экрана, нажмите “Add Diagram” (двойной клик)

Откроется новосозданная EER-диаграмма – пока пустая

Основные элементы управления расположены слева от клетчатого поля.

Назначение этих элементов (сверху вниз):

  • Выбор объектов
  • Перемещение схемы
  • Удаление объектов
  • Создание визуальных групп на диаграмме
  • Добавление текста на диаграмму
  • Добавление рисунка на диаграмму
  • Создание таблицы
  • Создание отображения
  • Создание группы процедур
  • Создание не идентифицирующей связи 1:1
  • Создание не идентифицирующей связи 1:M
  • Создание идентифицирующей связи 1:1
  • Создание идентифицирующей связи 1:M
  • Создание связи M:N
  • Создание связи по существующим ключам

Идентифицирующая связь в данном случае – связь по внешнему ключу, который входит в первичный ключ. Например, в отношениях

  • clients: (idClient, idManager, …)
  • managers: (idManager, …)

атрибут clients.idManager является внешним ключом, но связь clients и managers не будет идентифицирующей (M:1 или 1:1 в зависимости от ограничений на clients.idManager ).

  • purchaseArticles: (idPurchase, idArticle, quantity)
  • purchases: (idPurchase, …)
  • articles: (idArticle, …)

связи purchaseArticles c purchases articles будут идентифицирующими (M:1 в обоих случаях).

Создание таблиц

Нажатие на кнопку создания таблицы позволит разместить новый объект “таблица” на диаграмме.

Нажмите на кнопку создания таблицы, и затем в любое место на диаграмме (клетчатое поле).

Появится новый объект типа “таблица” с автоматически генерированным названием

При этом, автоматически будет выбран инструмент “выбор объекта” .

Откройте свойства объекта таблицы двойным щелчком на нем. Откроется окно свойств

На первой вкладке, Вы можете задать имя таблицы, способ хранения, кодировку и комментарий.

Переименуйте таблицу, согласно ее предполагаемому содержимому.

Далее полагается, что создается таблица clients из БД теннисного клуба.

На второй вкладке можно создать столбцы (атрибуты) таблицы

Двойной клик в пустом поле Column Name приведет к добавлению колонки. Следует задать имя и тип данных.

Можно так же задать различные атрибуты колонки:

  • PK – ключевой атрибут (часть первичного ключа)
  • NN – NOT NULL – не может иметь “пустое” значение
  • UQ – UNIQUE – значение должно быть уникально
  • BIN – предполагается хранение двоичных данных (используется для некоторых строковых типов)
  • UN – UNSIGNED – беззнаковое представление для численных типов
  • ZF – ZEROFILL – дополнять возвращаемое численное значение нулями слева
  • AI – AUTO_INCREMENT – автоматический счетчик

Так же можно задать значение по умолчанию в последней колонке.

“Лишние” колонки можно удалять, выбрав “Delete selected” в контекстном меню (по правой кнопке мыши). Не пытайтесь удалить последнюю (пустую) строчку!

После создания колонок для таблицы clients :

На третьей вкладке можно создать индексы

Индекс для первичного ключа создается автоматически.

Здесь следует создать индексы для внешних ключей. Для этого в левой части окна, делается двойной клик на пустой строке, вводится название индекса, и возможно выбирается тип (нас интересует в основном INDEX ).

После этого, в средней части выбираются индексируемые колонки.

В левой части можно указать настройки для индекса. Можно оставить их по умолчанию.

Например, создадим индекс для isMember

# в средней части окна соответствует положению колонки в создаваемом индексе. При создании индекса для составного внешнего ключа, порядок колонок в индексе должен совпадать с порядком во внешнем ключе.

Создадим остальные таблицы. Не забывайте создавать индексы для внешних ключей!

Создание связей

Будем использовать инструмент “Создание связи по существующим ключам” . Причина проста: все остальные инструменты автоматически создают колонки для внешних ключей, но мы уже создали эти колонки.

Можно было бы, конечно, сперва создать связи, и потом уже добавить оставшиеся колонки.

Создадим связь для внешнего ключа reserves.idClient с таблицей clients .

Нажмем на инструмент создания связи и выберем колонку reserves.idClient . В правом верхнем углу при этом появится подсказка:

Можно было бы выбрать дополнительно другие колонки для внешнего ключа, в случае составного ключа.

Теперь можно выбрать колонку другой таблицы, на которую ссылается данный внешний ключ. В нашем случае это, видимо, clients.id . Выберем его.

При наведении курсора мыши на связь, появляется подсказка с описанием связи.

Создадим связи для остальных таблиц.

Определения внешних ключей при этом будут созданы автоматически.

Уточнение внешних ключей

Автоматически созданные определения внешних ключей имеют в спецификаторах ON UPDATE и ON DELETE значение NO ACTION .

Пройдем по всем таблицам и установим необходимые действия.

На примере таблицы reserves , двойной клик на таблице открывает окно свойств. Четвертая вкладка Foreign Keys позволяет задать свойства внешних ключей.

Выберем первый ключ. В средней части окна показано, какая колонка является внешним ключом, и на какую колонку она ссылается. В данном примере это колонка idClient , ссылающаяся на clients.id . Зададим действия ON DELETE RESTRICT , ON UPDATE CASCADE .

Произведем аналогичную процедуру со вторым внешним ключом ( fk_reserves_courts1 ):

Создание SQL-скрипта схемы базы

На основе созданной диаграммы, можно сгенерировать SQL-код создания схемы.

Для этого запустите команду меню Database → Forward Engineer.

Откроется окно с предложением выбрать соединение (оставьте по умолчанию или задайте параметры соединения с БД)

Окно настроек генерируемого кода

Окно выбора элементов, на основе которых требуется создать SQL-код

И, наконец, будет показан созданный код

 -- MySQL Workbench Forward Engineering SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; -- ----------------------------------------------------- -- Schema mydb -- ----------------------------------------------------- -- ----------------------------------------------------- -- Schema mydb -- ----------------------------------------------------- CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ; USE `mydb` ; -- ----------------------------------------------------- -- Table `mydb`.`clients` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `mydb`.`clients` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '', `name` VARCHAR(200) NOT NULL COMMENT '', `isMember` TINYINT(1) NOT NULL COMMENT '', PRIMARY KEY (`id`) COMMENT '', INDEX `idx_isMember` (`isMember` ASC) COMMENT '') ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `mydb`.`courts` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `mydb`.`courts` ( `id` INT UNSIGNED NOT NULL COMMENT '', PRIMARY KEY (`id`) COMMENT '') ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `mydb`.`reserves` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `mydb`.`reserves` ( `idCourt` INT UNSIGNED NOT NULL COMMENT '', `startTime` DATETIME NOT NULL COMMENT '', `idClient` INT UNSIGNED NOT NULL COMMENT '', `duration` TIME NOT NULL COMMENT '', PRIMARY KEY (`idCourt`, `startTime`) COMMENT '', INDEX `idx_idCourt` (`idCourt` ASC) COMMENT '', INDEX `idx_idClient` (`idClient` ASC) COMMENT '', CONSTRAINT `fk_reserves_clients` FOREIGN KEY (`idClient`) REFERENCES `mydb`.`clients` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT, CONSTRAINT `fk_reserves_courts1` FOREIGN KEY (`idCourt`) REFERENCES `mydb`.`courts` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT) ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `mydb`.`prices` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `mydb`.`prices` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '', `name` VARCHAR(50) NOT NULL COMMENT '', `price` DECIMAL(14,4) NOT NULL COMMENT '', PRIMARY KEY (`id`) COMMENT '') ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `mydb`.`tariffs` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `mydb`.`tariffs` ( `idCourt` INT UNSIGNED NOT NULL COMMENT '', `isMember` TINYINT(1) NOT NULL COMMENT '', `idPrice` INT UNSIGNED NOT NULL COMMENT '', PRIMARY KEY (`idCourt`, `isMember`) COMMENT '', INDEX `idx_idPrice` (`idPrice` ASC) COMMENT '', CONSTRAINT `fk_tariffs_courts1` FOREIGN KEY (`idCourt`) REFERENCES `mydb`.`courts` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `fk_tariffs_prices1` FOREIGN KEY (`idPrice`) REFERENCES `mydb`.`prices` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB; SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

Этот код затем может быть выполнен на сервере СУБД.

ВАЖНО: Если для каких-то внешних ключей нет индексов, или тип внешнего ключа не соответствует типу атрибута, на который он ссылается, выполнение SQL-кода завершится ошибкой!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *