Создать таблицу в sql: MS SQL Server и T-SQL

Связи между таблицами базы данных / Хабр

1. Введение


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

1.1. Для кого эта статья?


Эта статья будет полезна тем, кто хочет разобраться со связями между таблицами базы данных. В ней я постарался рассказать на понятном языке, что это такое. Для лучшего понимания темы, я чередую теоретический материал с практическими примерами, представленными в виде диаграммы и запроса, создающего нужные нам таблицы. Я использую СУБД Microsoft SQL Server и запросы пишу на T-SQL. Написанный мною код должен работать и на других СУБД, поскольку запросы являются универсальными и не используют специфических конструкций языка T-SQL.

1.2. Как вы можете применить эти знания?

  1. Процесс создания баз данных станет для вас легче и понятнее.
  2. Понимание связей между таблицами поможет вам легче освоить нормализацию, что является очень важным при проектировании базы данных.
  3. Разобраться с чужой базой данных будет значительно проще.
  4. На собеседовании это будет очень хорошим плюсом.

2. Благодарности


Учтены были советы и критика авторов jobgemws, unfilled, firnind, Hamaruba.

Спасибо!

3.1. Как организовываются связи?


Связи создаются с помощью внешних ключей (foreign key).

Внешний ключ — это атрибут или набор атрибутов, которые ссылаются на primary key или unique другой таблицы. Другими словами, это что-то вроде указателя на строку другой таблицы.

3.2. Виды связей


Связи делятся на:

  1. Многие ко многим.
  2. Один ко многим.
    • с обязательной связью;
    • с необязательной связью;
  3. Один к одному.
    • с обязательной связью;
    • с необязательной связью;


Рассмотрим подробно каждый из них.

4. Многие ко многим


Представим, что нам нужно написать БД, которая будет хранить работником IT-компании. При этом существует некий стандартный набор должностей. При этом:

  • Работник может иметь одну и более должностей. Например, некий работник может быть и админом, и программистом.
  • Должность может «владеть» одним и более работников. Например, админами является определенный набор работников. Другими словами, к админам относятся некие работники.


Работников представляет таблица «Employee» (id, имя, возраст), должности представляет таблица «Position» (id и название должности). Как видно, обе эти таблицы связаны между собой по правилу многие ко многим: каждому работнику соответствует одна и больше должностей (многие должности), каждой должности соответствует один и больше работников (многие работники).

4.1. Как построить такие таблицы?


Мы уже имеем две таблицы, описывающие работника и профессию. Теперь нам нужно установить между ними связь многие ко многим. Для реализации такой связи нам нужен некий посредник между таблицами «Employee» и «Position». В нашем случае это будет некая таблица «EmployeesPositions» (работники и должности). Эта таблица-посредник связывает между собой работника и должность следующим образом:






EmployeeIdPositionId
11
12
23
33

Слева указаны работники (их id), справа — должности (их id). Работники и должности на этой таблице указываются с помощью id’шников.

На эту таблицу можно посмотреть с двух сторон:

  1. Таким образом, мы говорим, что работник с id 1 находится на должность с id 1. При этом обратите внимание на то, что в этой таблице работник с id 1 имеет две должности: 1 и 2. Т.е., каждому работнику слева соответствует некая должность справа.
  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». Она будет выглядеть так:





PhoneIdPersonIdPhoneNumber
1511 091-10
2519 124-66
31721 972-02

Данная таблица представляет три номера телефона. При этом номера телефона с id 1 и 2 принадлежат пользователю с id 5. А вот номер с id 3 принадлежит пользователю с id 17.

Заметка. Если бы у таблицы «Phones» было бы больше атрибутов, то мы смело бы их добавляли в эту таблицу.

5.2. Почему мы не делаем тут таблицу-посредника?


Таблица-посредник нужна только в том случае, если мы имеем связь многие-ко-многим. По той простой причине, что мы можем рассматривать ее с двух сторон. Как, например, таблицу EmployeesPositions ранее:

  1. Каждому работнику принадлежат несколько должностей (многие).
  2. Каждой должности принадлежит несколько работников (многие).


Но в нашем случае мы не можем сказать, что каждому телефону принадлежат несколько пользователей — номеру телефона может принадлежать только один пользователь.

Теперь прочтите еще раз заметку в конце пункта 5.1. — она станет для вас более понятной.

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». Она будет выглядеть так:





DisabledPersonIdEmployeeId
1159
2722
3937

Но это еще не связь один к одному. Дело в том, что в такую таблицу работник может быть вписан более одного раза, соответственно, мы получили отношение один ко многим: работник может быть несколько раз инвалидом. Нужно сделать так, чтобы работник мог быть вписан в таблицу только один раз, соответственно, мог быть инвалидом только один раз. Для этого нам нужно указать, что столбец 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. Один ко многим

  1. Один ко многим с обязательной связью:

    К одному полку относятся многие бойцы. Один боец относится только к одному полку. Обратите внимание, что любой солдат обязательно принадлежит к одному полку, а полк не может существовать без солдат.
  2. Один ко многим с необязательной связью:

    На планете Земля живут все люди. Каждый человек живет только на Земле. При этом планета может существовать и без человечества. Соответственно, нахождение нас на Земле не является обязательным


Одну и ту же связь можно рассматривать как обязательную и как необязательную. Рассмотрим вот такой пример:

У одной биологической матери может быть много детей. У ребенка есть только одна биологическая мать.

А) У женщины необязательно есть свои дети. Соответственно, связь необязательна.

Б) У ребенка обязательно есть только одна биологическая мать – в таком случае, связь обязательна.

7.2. Один к одному

  1. Один к одному с обязательной связью:

    У одного гражданина определенной страны обязательно есть только один паспорт этой страны. У одного паспорта есть только один владелец.
  2. Один к одному с необязательной связью:

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


Одну и ту же связь можно рассматривать как обязательную и как необязательную:

У одного человека может быть только один загранпаспорт. У одного загранпаспорта есть только один владелец.

А) Наличие загранпаспорта необязательно – его может и не быть у гражданина. Это необязательная связь.

Б) У загранпаспорта обязательно есть только один владелец. В этом случае, это уже обязательная связь.

7.3. Многие ко многим


Любая связь многие ко многим является необязательной. Например:

Человек может инвестировать в акции разных компаний (многих). Инвесторами какой-то компании являются определенные люди (многие).

А) Человек может вообще не инвестировать свои деньги в акции.

Б) Акции компании мог никто не купить.

8. Как читать диаграммы?


Выше я приводил диаграммы созданных нами таблиц. Но для того, чтобы их понимать, нужно знать, как их «читать». Разберемся в этом на примере диаграммы из пункта 5.3.

Мы видим отношение один ко многим. Одной персоне принадлежит много телефонов.

  1. Возле таблицы Person находится золотой ключик. Он обозначает слово «один».
  2. Возле таблицы Phone находится знак бесконечности. Он обозначает слово «многие».

9.

Итоги

  1. Связи бывают:
    • Многие ко многим.
    • Один ко многим.

      1) с обязательной связью;

      2) с необязательной связью.
    • Один к одному.

      1) с обязательной связью;

      2) с необязательной связью.
  2. Связи организовываются с помощью внешних ключей.
  3. Foreign key (внешний ключ) — это атрибут или набор атрибутов, которые ссылаются на primary key или unique другой таблицы. Другими словами, это что-то вроде указателя на строку другой таблицы.

10. Задачи


Для лучшего усвоения материала предлагаю вам решить следующие задачи:

  1. Описать таблицу фильм: id, название, длительность, режиссер, жанр фильма. Обратите внимание на то, что у фильма может быть более одного жанра, а к одному жанру может относится более, чем один фильм.
  2. Описать таблицу песня: id, название, длительность, певец. При этом у песни может быть более одного певца, а певец мог записать более одной песни.
  3. Реализовать таблицу машина: модель, производитель, цвет, цена
    • Описать отдельную таблицу производитель: id, название, рейтинг.
    • Описать отдельную таблицу цвета: id, название.


    У одной машины может быть только один производитель, а у производителя — много машин. У одной машины может быть много цветов, а у одного цвета может быть много машин.

  4. Добавить в БД из пункта 6.2. таблицу военно-обязанных по типу того, как мы описали отдельную таблицу DisabledEmployee.

Создание таблицы в SQL Server Management Studio


 Создание таблицы в SQL Server Management Studio 

последнее обновление: 27 июня 2018



Шаг 1.



Открывем (запускаем) SQL Server Management Studio…



Шаг 2. Создание таблицы



Нажимаем правой клавишей мыши на New Table. .. в
DatabasesMyDatabase1Tables
Если у вас не создана база MyDatabase1 , то создаем базу MyDatabase1…





 
Введем в таблице такую информацию (название колонки, тип данных колонки, флаг можно ли ввести NULL значение)





нажимаем на иконку сохранить





Напишем название таблицы Book и нажмем OK





Нажмем правой клавишей мыши на Id и выберем «Set Primary Key»





После нажатия «Set Primary Key» появится ключик









Шаг 3. Заполняем таблицу



Нажимаем правой клавишей мыши на Book и нажимаем Edit Top 200 Rows…





нажимаем на иконку сохранить





Наша таблица Book заполнена



Ваши Отзывы … комментарии…

 

 


  Языки программирования и другое  







Программы для разработки (интегрированные среды для разработки IDE)








Microsoft Visual Studio (среда разработки для написания программ на C#, С++, Javascript, ASP.NET приложений)









Visual Studio Code (редактор кода для написания программ на JavaScript, Perl, Python, Java, C#)








HTML









Интерактивная реклама в HTML (animate banner)








Google Web Designer — редактор для создания рекламы, animate banner и т. д. в виде HTML страницы, и в виде HTML AMP страниц (ускоренные мобильные страницы)








WEB сайт









Javascript, TypeScript











Кнопки, текстовые поля и другие элементы на WEB странице








jQuery UI — кнопки, меню, диалог, slider, spinner и так далее. Эфекты: растягивание, перетаскивание и так далее










Telerik, Kendo UI — это элементы: DropDownList, ComboBox, AutoComplete, Calendar, редактор текста, excell, chart и так далее








JavaScript технологии














RxJs (это реактивное программирование и в основном используется в Angular)








JavaScript графика, анимация для игр








p5. js — JavaScript библиотека для рисования графики 2D (рисование картинок, линий, движений), 3D графики (рисования материалы, свет, текстура)








JavaScript менеджер пакетов (добавление JavaScript библиотек в ваш Web проект)








npm — это менеджер пакетов для Node.js. npm добавляет JavaScript библиотеки в папку node_modules









Webpack — это САМЫЙ ПОПУЛЯРНЫЙ менеджер пакетов. Webpack добавляет JavaScript библиотеки в ваш проект









Yarn — это менеджер пакетов. Yarn добавляет JavaScript библиотеки в ваш проект









Parcel — это менеджер пакетов. Parcel добавляет JavaScript библиотеки в ваш проект









Bower — это менеджер пакетов. Bower добавляет JavaScript библиотеки в ваш проект. Bower сейчас НЕ ПОДДЕРЖИВАЕТСЯ (не добавляет новых JavaScript библиотек)








Автоматическое выполнение задач в вашем Web проекте








Gulp — это JavaScript программа для автоматического выполнения задач (объединения файлов, уменьшение размера картинок) в вашем Web проекте









Grunt — это JavaScript программа для автоматического выполнения задач (объединения файлов, уменьшение размера картинок) в вашем Web проекте








База данных (My SQL)








MySQL (база данных, server) и Workbench (программа для работы с my sql). Работает на разных платформах: Unix, Windows








База данных (Microsoft SQL Server)








Microsoft SQL Server (база данных, server) и SQL Management Studio (программа для работы с sql server). Работает только в Windows









Microsoft SQL (язык запросов в базе данных)








База данных (PostgreSQL)








PostgreSQL сервер (база данных) и pgAdmin (программа для работы с PostgreSQL сервер). Работает на разных платформах: Unix, Windows








Работа с базой данных на C#








ADO.NET (работа с базой данных на C#)









Entity Framework (EF5, EF6) для работы с базой данных на C#









Entity Framework Core (EF Core) для работы с базой данных на C#








Работа с Redis








Redis








Интернет, HTTP, TCP, UDP, FTP протоколы







RabbitMQ








RabbitMQ








Microsoft C# и . NET






















Microsoft Visual Basic








Microsoft Visual Basic & Excell








Microsoft Office 365 E3 (Web services)








Microsoft Office 365 E3 (Teams plug-in, SharePoint web api)








Twilio (sms)








Twilio (send sms)








Python








Python








Java







Android телефон, планшет (пишем приложение на Java, игру на C++)







Mobile Development with C++ (Android, iOS)








Mobile Development with C++ (iOS, Android, Windows Phone)








Flutter & Dart








Flutter — фрэймворк для создания мобильных приложений от компании Google








Облачные технологии








Microsoft Azure & Azure DevOps (облачные технологии)









Amazon Web Services (облачные технологии)









Google Cloud Platform (облачные технологии)









Heroku (облачные технологии)








Рисуем блок схемы (диаграммы) для программы








Рисуем блок схемы (диаграммы) для программы








Резюме (как найти работу)








Как написать резюме, причины перехода на другую работу








Автоматизированное тестирование








Selenium WebDriver (для автоматизированного тестирования веб-приложений)








Рефакторинг & Паттерны







Методологии управления проектами








Agile, scrum, kanban. Методологии в управлении IT-проектам. В чем разница?









Правила разработки web приложений в Яндекс








Управление версиями проекта, история измененных файлов









Svn (управление версиями проекта, история измененных файлов) | TortoiseSVN (работаем с SVN под Windows)








Математические алгоритмы








Математические алгоритмы (пересечение прямоугольников, массивы, графы)








CI/CD








Непрерывная интеграция (автоматическая сборка проекта, развертывание проекта на удаленный компьютер) | CI/CD








Docker







Kubernetes








Kubernetes (запуск контейнеров на виртуальных машинах и балансировка нагрузки виртуальных машин)








Микрослужбы







Еще языки программирования









C++








Разработка игр








Разработка игр | для телефонов на Unity, MonoGame | для браузера Google Chrome на JavaScript, HTML | рисуем графику










Технологии для написания игр










SmartFoxServer — библиотека multiplayer на Java, C#, JavaScript, Unity, для Android, iOS








Интернет браузеры








Интернет браузер «Google Chrome»








Telegram (месенджер)








Telegram (месенджер)








WEB сервер








Что такое WEB сервер ?








bat файлы








. bat файл (командная строка)








.htaccess Файлы








.htaccess файл (Команды)








Viber








Viber. Устанавливаем (на Windows или phone). Переносим Viber сообщения и Viber фото.








Операционная система LINUX








Ubuntu (linux) Virtual Machine on Windows 10









Ubuntu (in console as WSL) on Windows 10








Операционная система Mac OS








Mac OS Virtual Machine on Windows 10








Операционная система WINDOWS и программы










Операционная система ANDRIOD







Операционная система iOS







Компьютерная платформа (процессор)








x86 процессоры









ARM процессоры








Ноутбук (BIOS)








В ноутбуке не работают клавиши F1 . .. F2 как надо. Проблема: я открываю браузер Google Chrome и нажимаю кнопку F5 чтобы перезагрузить страницу, а у меня включается подсветка клавиатуры.








Быстродействие компьютера (процессора)








Сравниваем быстродействие компьютера (процессора) на сайте http://userbenchmark.com








Заходим на удаленный компьютер (чтобы помочь кому нибудь что нибудь настроить)








TeamViewer (заходим на удаленный компьютер)








Графика и видео







2D графические редакторы







3D графические редакторы








Видео







Online: просмотр Word файлов, конвертация PDF файлов, распознование картинки в текст








Просмотр и редактирование Word файлов (doc, docx) ОНЛАЙН









Просмотр и редактирование Word файлов (doc, docx), Adobe (pdf) ОНЛАЙН








PDF to word, images








Convert PDF to Word (online)









Convert FB2 to PDF (online)








Распознавание картинки в текст








Распознать (перевести) картинку в текст (ONLINE)








Регулярные выражения








Регулярные выражения (проверить онлайн)








Поставить HD Video Box в Windows








Поставить HD Video Box в Windows








Как купить английские книги и читать?








Как купить английские книги и читать








Chemical, analytics laboratory








Chemical, analytics laboratory (Chromatography / Mass Spectroscopy)


SQL Create Table — Хранение всех вещей

Back SQL Create Table — Хранение всех вещей

Реляционные базы данных хранят информацию в таблицах — со столбцами, которые аналогичны элементам в структуре данных, и строками, которые являются одним экземпляром этой структуры данных. — которые создаются с помощью оператора SQL Create Table. При создании таблиц каждый указанный столбец может иметь две характеристики:

  • тип — какие данные могут храниться
  • 9Ограничение 0007 — ограничения на данные

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

Типы данных SQL

Поскольку поставщики баз данных выбирают, какой стандартный SQL ANSI имплементировать, а стандарт развивается, вам придется проверять свою конкретную базу данных на наличие допустимых типов данных и синонимов. Как правило, все базы данных поддерживают следующие типы данных:

Тип данных SQL
Символ CHAR, VARCHAR, CLOB
Двоичный Двоичный, VARBINARY, BLOB
Числовой (точный) ЦИФРОВОЙ, DECIMAL, SMALLINT, INTEGER, BIGINT
Числовое (приблизительное) FLOAT, REAL, DOUBLE
Time DATE, TIME, TIMESTAMP 90 024
Другое INTERVAL, BOOLEAN, XML, JSON

Ограничения данных SQL

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

Ограничение Описание
Проверка Убедитесь, что все значения столбцов удовлетворяют определенным условиям.
ПО УМОЛЧАНИЮ Установите значение столбца, если оно не указано.
FOREIGN KEY Уникально идентифицирует строку/запись в другой таблице.
ИНДЕКС Оптимизация для быстрого поиска данных.
NOT NULL Убедитесь, что значение столбца содержит значение, отличное от NULL.
ПЕРВИЧНЫЙ КЛЮЧ Уникальная идентификация каждой строки с помощью комбинации NOT NULL и UNIQUE.
УНИКАЛЬНЫЙ Убедитесь, что все значения в столбце разные.

Базовый SQL Create Table & Constraint Examples

Оператор SQL Create Table выглядит так:

 CREATE TABLE имя_таблицы (
столбец_1 тип_данных столбец_ограничение,
столбец_2 тип_данных столбец_ограничение,
столбец_3 тип_данных столбец_ограничение,
. ..); 

Для иллюстрации давайте создадим таблицу для компаний и их биржевых кодов. И символ тикера, и названия компаний должны содержать что-то (например, NOT NULL ), а символы должны быть уникальными (как на реальных фондовых рынках).

 СОЗДАТЬ ТАБЛИЦУ компаний (
symbolVARCHAR(6)НЕ NULL УНИКАЛЬНЫЙ,
имяVARCHAR(40) НЕ NULL,
ИНДЕКС(символ) );
 
ВСТАВИТЬ В КОМПАНИИ
ЦЕННОСТИ
(«GBTC», «Оттенки серого»),
(«МСТР», «МикроСтратегия»),
(«ЦЛА», «Тесла»);
ВЫБЕРИТЕ * ОТ компаний; 
символ имя
GBTC оттенки серого
MSTR MicroStrategy
TSLA Tesla

Еще одна таблица, которую мы заполним корпоративными служащими, покупающими активы, их компаниями, биографической информацией о возрасте и суммы покупки. Мы ограничиваем возраст, чтобы гарантировать, что офицеры являются совершеннолетними, мы добавляем значение по умолчанию к сумме покупки и заставляем базу данных создавать идентификатор транзакции — монотонно возрастающее целочисленное значение, — которое мы идентифицируем как первичный ключ (для быстрого поиска). . Мы связываем таблицы закупок и компаний через тикер компании в качестве внешнего ключа (для проверки символов).

 СОЗДАТЬ ТАБЛИЦУ покупок (
    транзакцияINTNOT NULL AUTO_INCREMENT,
    покупательVARCHAR(50),
    ageINTCHECK (возраст >= 18),
    компанияVARCHAR(33),
    количествоFLOATDEFAULT 0.0,
    ПЕРВИЧНЫЙ КЛЮЧ (транзакция),
    FOREIGN KEY (компания) REFERENCES компании (символ)
    ) ;
 
ВСТАВИТЬ В покупки (покупатель, возраст, компания, сумма)
ЦЕННОСТИ
    ("Барри Силберт", 43 года, "GBTC", 449596),
    («Майкл Сэйлор», 56, «МСТР», 71079),
    ("Илон Маск", 49, "ЦЛА", 44776119)
;
ВЫБЕРИТЕ * ИЗ покупок ; 
сделка покупатель возраст компания 9002 4

сумма
1 Барри Силберт 43 GBTC 449596
2 Майкл Сэйлор 56 MSTR 71079
3 Элон Маск 49 ЦЛА 44776119

Ограничения, защищающие целостность данных

Попытка вставить в таблицу закупок строку со строкой компании, которая не отображается в таблице компаний, вызовет ошибку проверки данных (что и следовало ожидать, учитывая FOREIGN). ограничение KEY ). Например:

 ВСТАВЬТЕ В ПОКУПКИ (покупатель, возраст, компания, сумма)
ЗНАЧЕНИЯ ("Стив Джобс", 99, "AAPL", 0); 

возвращает следующую ошибку, показывающую, что ограничение внешнего ключа защитило целостность данных значений таблицы.

Невозможно добавить или обновить дочернюю строку: ошибка ограничения внешнего ключа (`database`.`purchases`, CONSTRAINT `purchases_ibfk_1` FOREIGN KEY (`company`) REFERENCES `companies` (`symbol`))

Попытка вставка значения возраста менее 18 лет приведет к аналогичной ошибке.

SQL Create Table From

Поскольку эти таблицы сейчас «в производстве» — и, следовательно, их нельзя подделывать — для создания тестовой таблицы и заполнения ее датами, которые в настоящее время находятся в таблице закупок, мы можем:

 СОЗДАТЬ ТАБЛИЦУ Purchases_copy КАК ВЫБРАТЬ компанию, сумму ИЗ покупок ; 

SQL Drop Table

Аналогом создания таблиц является оператор SQL Drop Table, который удаляет структуру таблицы и данные внутри.

Заключение

SQL Create Table создает новые таблицы и может копировать существующие. Для каждого столбца могут быть указаны различные типы данных, а необязательные ограничения обеспечивают проверку целостности и достоверности данных. Некоторые ограничения обращены вовнутрь, например AUTO_INCREMENT , тогда как FOREIGN KEY обращается к другим таблицам для поддержки целостности.

Начать обучение

Чтобы узнать больше о SQL, зарегистрируйтесь в нашей программе SQL Nanodegree, подробно описанной здесь.

[et_bloom_locked optin_id=”optin_4″]

[/et_bloom_locked]

DB2 — Оператор SQL Create Table


Оператор CREATE TABLE используется для создания новой таблицы в базе данных.

Таблицы можно создавать двумя способами:

  1. Путем явного указания столбцов и их типов данных.

  2. Создание на основе существующей таблицы.

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

CREATE TABLE имя-таблицы
               определение столбца 
               таблица-ограничение-пункт 
               пункт физического хранения 
  определение столбца: 
тип данных имени столбца
    [С выражением ПО УМОЛЧАНИЮ]
    [НУЛЬ|НЕ НУЛЬ]
    [колонка-ограничение-условие]
    [ тип данных имя-столбца [С выражением по умолчанию] [NULL|NOT NULL]
    [столбец-ограничение-условие]. ..]
  Ограничение (условие ограничения столбца или ограничение таблицы) 
[CONSTRAINT имя-ограничения]
    [REFERENCES имя-таблицы [(имя-столбца)]
          [НА УДАЛЕНИЕ {ОГРАНИЧЕНИЕ | КАСКАД| УСТАНОВИТЬ НУЛЕВОЕ}]
    [УНИКАЛЬНЫЙ]
    [ОСНОВНОЙ КЛЮЧ]
    [ПРОВЕРИТЬ (проверить-условие)]
  пункт физического хранения 
IN имя-базы-данных.имя-табличного-пространства
 

По умолчанию:

  • Когда строка вставляется в таблицу, а для столбца не указано значение, значение
    указанный в предложении по умолчанию, вставляется.
  • Если выражение пропущено в предложении по умолчанию, то значение по умолчанию, определенное системой
    для типа данных столбца будет заменено.

NULL / NOT NULL:

  • NULL используется по умолчанию.
  • NOT NULL: запрещает столбцу содержать нулевые значения. Пропуск NOT NULL
    подразумевает, что столбец может содержать нулевые значения.

Ограничения:

Ограничения определяются на двух возможных уровнях.

  • Уровень столбца:

    Ограничение на уровне столбца относится к одному столбцу и определяется вместе
    с колонной.
    Их также называют «встроенными ограничениями»

    .

  • Уровень стола:

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

  • Вы должны использовать ограничение на уровне таблицы, если ограничиваете более одного столбца.

Имя ограничения:

  • Называет ограничение и является необязательным.

  • Если имя ограничения не указано, то создается уникальное имя ограничения.

  • Если указано имя, оно должно отличаться от имени любого референта, отметьте,
    первичный ключ или ограничения уникального ключа, ранее указанные в таблице.

Ограничение FOREIGN KEY

  • Ограничение FOREIGN KEY определяется ключевым словом REFERENCES.

  • Ограничение FOREIGN KEY (ограничение ссылочной целостности) гарантирует, что значения
    во внешнем ключе соответствуют значениям первичного ключа.

  • При определении ограничения FOREIGN KEY для таблицы имя столбца не имеет
    быть идентичным имени столбца, на который он ссылается.

  • По умолчанию ограничение внешнего ключа имеет тип DELETE RESTRICT: Parent rows
    нельзя удалить, если существуют дочерние строки.

  • ON DELETE CASCADE: позволяет удалить строку первичного ключа, а также удаляет
    строки внешнего ключа, которые относятся к нему.

  • SET TO NULL: позволяет удалить строку первичного ключа и вместо удаления всех
    связанных строк внешнего ключа, устанавливает для столбцов внешнего ключа значение NULL.

Ограничение UNIQUE:

  • Для обеспечения уникальных значений для отдельного столбца или группы столбцов.

  • Столбец ограничений UNIQUE не должен содержать значений NULL.

  • Таблица может содержать одно или несколько ограничений UNIQUE.

Ограничение PRIMARY KEY:

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

Проверка:

Ограничения CHECK применяют логические выражения к столбцу/столбцам, которые должны
оценивается как true для каждой строки в таблице.

Создание таблиц на основе других таблиц.

Ниже приведен синтаксис создания таблицы на основе существующей таблицы:

CREATE TABLE имя-назначения-таблицы
      LIKE имя-исходной-таблицы
      IN имя-базы-данных.имя-табличного-пространства 

Пример 1:

Создайте таблицу TB_TAB1 в базе данных DB_DB1 и табличном пространстве TS_TS1 со следующими спецификациями.
с ограничениями уровня столбца и с неявными именами ограничений.

Имя столбца Тип данных Длина Ограничение Примечания
TAB1_COL1 Целое число Первичный ключ
TAB1_COL2 Целое число Не нуль
TAB1_COL3 Варчар 5 внешний ключ к ZIP
столбец
Таблица ZIPCODE — если
строка в ZIPCODE
таблица удалена, любая
ряды с одинаковыми
почтовый индекс должен быть
удалено из TAB1
стол
TAB1_COL4 Дата Текущая дата должна
быть вставленным по умолчанию
TAB1_COL5 Символ 20 Уникальный
TAB1_COL6 Целое число Следует принять
значения, которые меньше
чем 100. Нулевое значение
допустимый.

Давайте посмотрим, как написать оператор CREATE TABLE ниже,

СОЗДАТЬ ТАБЛИЦУ TB_TAB1
    (TAB1_COL1 INTEGER NOT NULL PRIMARY KEY,
      TAB1_COL2 INTEGER НЕ NULL,
      TAB1_COL3 VARCHAR(5) ССЫЛКИ ПОЧТОВЫЙ ИНДЕКС(ZIP)
          НА УДАЛЕНИЕ КАСКАДА,
      TAB1_COL4 ДАТА ПО УМОЛЧАНИЮ,
      TAB1_COL5 CHAR(20) НЕ NULL УНИКАЛЬНО,
      TAB1_COL6 ПРОВЕРКА ЦЕЛЫХ ЧИСЕЛ (TAB1_COL6 < 100))
      В DB_DB1.TS_TS1; 

Объяснение:

  • TAB1_COL1 INTEGER NOT NULL PRIMARY KEY: Когда вы определяете столбец как основной
    Ключ, он должен быть определен как «Not Null» (столбец первичного ключа не должен содержать Null).
    ценности).

  • TAB1_COL5 CHAR (20) NOT NULL UNIQUE: при определении столбца с уникальным
    ограничение, оно должно быть определено как «Not Null» (столбец уникального ограничения не должен содержать
    нулевые значения).

  • TAB1_COL4 ДАТА ПО УМОЛЧАНИЮ: если во время вставки вы не укажете значение для этого столбца,
    затем будет вставлено значение по умолчанию «Текущая дата» для переменной «Дата».


Пример 2:

Создайте таблицу TB_TAB1 в базе данных DB_DB1 и табличном пространстве TS_TS1 со следующими спецификациями.
с ограничениями уровня таблицы, назвав ограничения исключительно.

Имя столбца Тип данных Длина Ограничение Примечания
TAB1_COL1 Целое число Первичный ключ
TAB1_COL2 Целое число Не нуль
TAB1_COL3 Варчар 5 внешний ключ к ZIP
столбец
Таблица ZIPCODE - если
строка в ZIPCODE
таблица удалена, любая
ряды с одинаковыми
почтовый индекс должен быть
удалено из TAB1
стол
TAB1_COL4 Дата Текущая дата должна
быть вставленным по умолчанию
TAB1_COL5 Символ 20 Уникальный
TAB1_COL6 Целое число Следует принять
значения, которые меньше
чем 100. Нулевое значение
допустимый.

Давайте посмотрим, как написать оператор CREATE TABLE ниже,

СОЗДАТЬ ТАБЛИЦУ TB_TAB1
      (TAB1_COL1 INTEGER NOT NULL,
      TAB1_COL2 INTEGER НЕ NULL,
      TAB1_COL3 VARCHAR(5),
      TAB1_COL4 ДАТА ПО УМОЛЧАНИЮ,
      TAB1_COL5 СИМВОЛ(20) НЕ ПУСТО,
      TAB1_COL6 ЦЕЛОЕ ЧИСЛО НЕ НУЛЕВОЕ,
          ОГРАНИЧЕНИЕ TAB1_COL1_PK ПЕРВИЧНЫЙ КЛЮЧ (TAB1_COL1),
          ОГРАНИЧЕНИЕ TAB1_COL3_FK ВНЕШНИЙ КЛЮЧ(TAB1_COL3)
      ССЫЛКИ ПОЧТОВЫЙ ИНДЕКС (ZIP),
          ОГРАНИЧЕНИЕ TAB1_COL5_COL6_UK UNIQUE(TAB1_COL5,TAB1_COL6),
          ОГРАНИЧЕНИЕ TAB1_COL6_CK ПРОВЕРКА (TAB1_COL6 < 100))
      В DB_DB1.TS_TS1;
 

Объяснение:

ОГРАНИЧЕНИЕ TAB1_COL5_COL6_UK UNIQUE(TAB1_COL5,TAB1_COL6): как два
столбцы TAB1_COL5 и TAB1_COL6 должны иметь уникальные ограничения, которые вы объединили
и создал это ограничение, и эти два столбца определены с предложением NOT NULL.