Online Documentation for SQL Manager for SQL server
SQL Manager for SQL Server позволяет создавать связи между таблицами — внешние ключи — в окне диаграммы. Для этого на панели инструментов окна диаграммы надо нажать кнопку Create relation .
Теперь, чтобы установить связь между двумя таблицами нужно нажать мышкой на каждой из них. После этого откроется редактор внешних ключей, в котором Вы сможете задать все свойства создаваемой связи.
Связь между таблицами отображается в виде соединительной линии.
Управление связью осуществляется с помощью контекстного меню, которое открывается при нажатии правой кнопкой мыши на связь.
С помощью этого меню Вы можете:
- открыть связь в редакторе внешних ключей — Edit Foreign Key «имя_объекта» ,
- удалить связь Drop Foreign Key «имя_объекта» .
При создании связи с помощью кнопки Create relation на панели инструментов диаграммы выбранные поля автоматически заносятся в редактор внешних ключей.
Как создать связи в sql



Скачай курс
в приложении
Перейти в приложение
Открыть мобильную версию сайта
© 2013 — 2023. Stepik
Наши условия использования и конфиденциальности

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-кода завершится ошибкой!
