JavaRush /Курсы /SQL & Hibernate /Создание таблиц

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

SQL & Hibernate
6 уровень , 1 лекция
Открыта

Осмысленное создание таблиц

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

Создание таблицы очень напоминает объявление класса в Java и имеет такой шаблон:

CREATE TABLE table_name ( column1 datatype, column2 datatype, column3 datatype, ... );

Давай для примера напишем запрос, который создает таблицу с пользователями:

CREATE TABLE user ( id INT, name VARCHAR(100), level INT, created_date DATE );

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

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

А во-вторых, у каждой колонки могут быть дополнительные настройки.

И начнем мы с настроек создания колонок.

Ключи в таблице

У колонки таблицы кроме имени и типа данных могут быть еще такие настройки:

PRIMARY KEY Колонка является ключом таблицы
UNIQUE KEY Все значения колонки должны быть уникальны
DEFAULT value Значение по умолчанию
NOT NULL Запрет принимать значение NULL
AUTO_INCREMENT SQL-сервер будет автоматически увеличивать значение при добавлении новой записи в таблицу
GENERATED Вычисляемое поле
STORAGE Где хранить данные: на диске или в памяти
COMMENT Комментарий к колонке, например, название на локальном языке

Ниже мы рассмотрим некоторые из них.

Во-первых, это PRIMARY KEY.

Чаще всего это отдельная колонка с именем id и типом INT. Это так называемый “главный ключ” таблицы, и все ее строки имеют уникальные значения этого ключа. В первую очередь он используется для того, чтобы другие таблицы могли ссылаться на записи нашей таблицы и указывать на ее определенную запись.

Во-вторых, это UNIQUE KEY.

Чем-то он похож на PRIMARY KEY, хотя смысловая нагрузка у него абсолютно другая. Если колонка имеет атрибут UNIQUE, то все значения этой колонки должны быть уникальны. Хороший пример отличия UNIQUE KEY и PRIMARY KEY – это список людей в паспортном столе.

Налоговый номер – это PRIMARY KEY, он используется для того, чтобы легко было ссылаться на нужного человека из других таблиц.

Номер паспорта – это UNIQUE KEY. Не может быт двух людей с одинаковым номером паспорта. Однако номер паспорта можно поменять. Например, при смене фамилии. А налоговый номер останется с вами навсегда. Это и есть основная задача PRIMARY KEY. Пример запроса с указанием PRIMARY KEY:

CREATE TABLE user ( id INT, name VARCHAR(100), level INT, created_date DATE, PRIMARY KEY (id) );

Настройки типа данных

Есть менее важные, но полезные атрибуты.

DEFAULT value

При вставке данных (добавлении новой строки) в таблицу можно не указывать значения некоторых колонок, если те имеют значение по умолчанию. В таком случае SQL-сервер просто установит значение колонки сам.

Начиная с 8-й версии MySQL в качестве значения можно указывать выражение.

NOT NULL

Если при создании таблицы у колонки указать атрибут NOT NULL, то SQL-сервер будет следить за тем, чтобы в эту колонку нельзя было сохранить значение NULL. По умолчанию у любой колонки может быть значение NULL, даже у колонки с типом INT. Что немного неочевидно для Java-программиста.

AUTO_INCREMENT

Обычно он используется для id колонок. Когда ты добавляешь новую строку в таблицу, то очень хочется, чтобы SQL-сервер сам присвоил id для этой записи. Кто как не сервер лучше всего знает, сколько у него строк в таблице. Особенно если к одному SQL-серверу идут запросы с разных клиентов.

Именно это и делает атрибут AUTO_INCREMENT. При добавлении новой строки мы просто не передаем ничего в качестве id, и SQL-сервер сам укажет нужный ID для этой записи: он просто возьмет ID последней существующей записи и увеличит его на 1. Этот атрибут можно использовать только с типами целых и вещественных чисел. И, конечно же, давай сделаем пример создания такой таблицы:

CREATE TABLE user ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(100) NOT NULL, level INT DEFAULT 1, created_date DATE NOT NULL, PRIMARY KEY (id) );
Комментарии (19)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Олег Уровень 79 Expert
25 февраля 2024
Дурацкая задача 0604, про not null в условии ни слова не сказано, и почему не принимает с указанием PRIMARY KEY так как в примере урока указано???
Дмитрий Уровень 109 Expert
21 апреля 2024
Про NOT NULL указано, что добавить обязательную колонку
I'm Siberian Уровень 109 Expert
18 января 2025
Давай почитаем внимательно: 2. Добавить обязательную колонку user_id с типом INT, без ограничения и с auto increment. что-то я не вижу тут ни слова про нотНуль
Евгений Уровень 97
19 января 2025
Обязательная колонка и есть not null. Но в целом да... это жесть...
Long_byte Уровень 14
3 февраля 2025
а где задачи то у меня только лекции
MrFurion Уровень 32
4 сентября 2023
явно создание новых таблиц куда проще в Workbench. Этим запросом я так и не создал таблицу я хз описание кривуше просто до нельзя. Куда она СОЗДАЕТЬСЯ ???????? или как с въюс догадайся сам что делаться отдельный файл. CREATE TABLE user ( id INT, name VARCHAR(100), level INT, created_date DATE, );
MrFurion Уровень 32
4 сентября 2023
да запятую я убирал !
Anonymous #3322801 Уровень 1 Expert
31 октября 2023
Она создается в схему, которая по умолчанию наверху в Intellij IDEA. Ее надо выбрать перед выполнением запроса, иначе будет ошибка. Либо ты можешь явно использовать

USE schema_name;
create table table_name
(
    ....
);
По view тот же самый принцип действует... тоже долго искала куда же она сохранилась. Оказалось по умолчанию в ту схему, которая была выбрана наверху Intellij IDEA.

use schema_name;
create view my_view as
select * from table_name;
Dima Makarov Уровень 42
14 июля 2023
ОШИБКА CREATE TABLE user ( id INT, name VARCHAR(100), level INT, created_date DATE, Нужно убрать запятую, иначе будет выдавать ошибку. );
Ruslan Shamsiev Уровень 1
11 января 2023
DEFAUL - опечатка
Александр Уровень 108 Expert
22 декабря 2022
Подача материала в стиле джавараш. Сначала ты сам помучайся и поковыйряйся с гуглом, а потом я тебе объясню как это работает через несколько левелов :)
Сергей Уровень 111 Expert
15 декабря 2022
Разве есть разница между

DEFAULT GETDATE() not null
и
 not null DEFAULT GETDATE()
? Даже idea формирует запрос вида:

date date default curdate() not null;
А здесь же валидатор не пускает
Владимир Уровень 109 Expert
11 декабря 2022
0605. А зачем полю weght обязательно указывать ключ NULL, он же и так по умолчанию будет?
Sergey Drogunov Уровень 111 Expert
25 ноября 2022
Задача 0605 Не находит метод GETDATE() MySQL 8.0 Кто подскажет на основании чего дана нам эта функция?? [42000][1064] You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GETDATE(), weight FLOAT(10) NULL , PRIMARY KEY(user_id) )' at line 5 Если кто захочет узнать как установить значение DЕFAULT для DATE в MySQL 8 вам сюда, займет 2 минуты. Документация
Александр Ц. Уровень 108 Expert
11 декабря 2022
Функция дана в учебных целях, чтобы показать, что для DEFAUL value: Начиная с 8-й версии MySQL в качестве значения можно указывать выражение.
Igor Уровень 108 Expert
22 ноября 2022
Может я не один такой, "обязательная колонка" - это значит NOT NULL
Anonymous #3322801 Уровень 1 Expert
31 октября 2023
После прохождения JavaRush можно смело устраиваться на шоу Гадалка на ТВ3 😃
Nikita Shamrai Уровень 8 Expert
6 ноября 2022
В примерах все названия колонок без кавычек, а в задачах в кавычках еще и необычных.
Stas S Уровень 108 Expert
11 ноября 2022
Они ни на что не влияют. В первой задаче и вовсе отсутствует валидация.