Урок доступен в видеоформате 

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

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

Перед созданием таблицы необходимо выбрать базу данных, в которую таблица будет записана. Это делается с помощью оператора USE:

MySQL 8.4
USE имя_базы_данных;
имя_базы_данных
База данных, в которой будут создаваться таблицы.

Для создания таблицы используется оператор CREATE TABLE. Его базовый синтаксис имеет следующий вид:

MySQL 8.4
CREATE TABLE [IF NOT EXISTS] имя_таблицы (
    столбец тип_данных [, ...]
);
  • [ ]необязательная часть
  • ...можно повторить
IF NOT EXISTS

Не создавать таблицу, если таблица с таким именем уже есть. Без этой части запрос в таком случае завершится ошибкой.

Ключевое словоНеобязательный
имя_таблицы
Имя новой таблицы.
столбец

Имя столбца. Пар столбец тип_данных может быть несколько, через запятую.

тип_данных

Какие значения хранит столбец, например INTEGER для чисел или VARCHAR(255) для строк.

Например, создадим таблицу пользователей.

MySQL 8.4
CREATE TABLE Users (
    id INTEGER,
    name VARCHAR(255),
    age INTEGER
);
MySQL 8.4
CREATE TABLE Users (
    id INTEGER,
    name VARCHAR(255),
    age INTEGER
);

INTEGER, VARCHAR(255) - типы данных: числовой и строковый соответственно. Более подробно о них можно будет узнать в следующих статьях.

INTEGER, VARCHAR(255) - типы данных: числовой и строковый соответственно. Более подробно о них можно будет узнать в следующих статьях.

Дополнительные параметры определения столбцов

Вышеприведённое определение столбцов в таблице является упрощённым. Помимо названия столбца и его типа в определение иногда необходимо добавлять следующие необязательные параметры:

  • PRIMARY KEY

    Указывает колонку или множество колонок как первичный ключ.

  • AUTO_INCREMENT

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

  • SERIAL или GENERATED ALWAYS AS IDENTITY

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

  • UNIQUE

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

  • NOT NULL

    Указывает, что значения в данной колонке должны быть отличными от NULL.

  • DEFAULT

    Указывает значение по умолчанию.

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

MySQL 8.4
CREATE TABLE Users (
    id INTEGER PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    age INTEGER NOT NULL DEFAULT 18
);
MySQL 8.4
CREATE TABLE Users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    age INTEGER NOT NULL DEFAULT 18
);

Так, в данном примере:

  • id - поле числового типа, являющееся первичным ключом с автоинкрементом;
  • id - поле типа SERIAL (автоинкрементное целое число), являющееся первичным ключом;
  • name - поле строкового типа с максимальной длиной в 255 символов, являющееся обязательным к заполнению;
  • age - поле числового типа со значением по умолчанию равным 18.

CURRENT_TIMESTAMP как значение по умолчанию

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

MySQL 8.4
CREATE TABLE Users (
    id INTEGER PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
MySQL 8.4
CREATE TABLE Users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Описание таблицы

Для того чтобы посмотреть описание созданной таблицы, можно воспользоваться оператором DESCRIBE.

MySQL 8.4
DESCRIBE Users;
FieldTypeNullKeyDefaultExtra
idintNOPRINULLauto_increment
namevarchar(255)NONULL
ageintNO18

Для того чтобы посмотреть описание созданной таблицы, можно воспользоваться SQL запросом к информационной схеме:

MySQL 8.4
SELECT column_name, data_type, is_nullable, column_default
FROM information_schema.columns
WHERE table_schema = current_schema() AND table_name = 'users';
column_namedata_typeis_nullablecolumn_default
idintegerNOnextval('users_id_seq'::regclass)
namecharacter varyingNO<NULL>
ageintegerNO18

Дополнительные параметры определения таблицы

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

Первичный ключ

Если вы не определили первичный ключ с помощью параметров столбца, то это можно сделать с помощью дополнительных параметров таблицы, добавив запись PRIMARY KEY (столбец [, ...]) после перечисления столбцов:

MySQL 8.4
CREATE TABLE Users (
    id INTEGER,
    name VARCHAR(255) NOT NULL,
    age INTEGER NOT NULL DEFAULT 18,
    PRIMARY KEY (id)
);

Первичный ключ

Если вы не определили первичный ключ с помощью параметров столбца, то это можно сделать с помощью дополнительных параметров таблицы, добавив запись PRIMARY KEY (столбец [, ...]) после перечисления столбцов:

MySQL 8.4
CREATE TABLE Users (
    id INTEGER,
    name VARCHAR(255) NOT NULL,
    age INTEGER NOT NULL DEFAULT 18,
    PRIMARY KEY (id)
);

Внешние ключи

Предположим, что мы хотим хранить данные о компании, в которой работают наши пользователи. Давайте создадим небольшую таблицу Companies, в которой мы будем хранить уникальный идентификатор и название компании:

MySQL 8.4
CREATE TABLE Companies (
    id INTEGER,
    name VARCHAR(255) NOT NULL,
    PRIMARY KEY (id)
);

Дальше нужно добавить в таблицу Users поле company – место работы нашего пользователя, которое будет ссылаться на запись в таблице Companies. Полный запрос для создания таблицы будет выглядеть так:

MySQL 8.4
CREATE TABLE Users (
    id INTEGER,
    name VARCHAR(255) NOT NULL,
    age INTEGER NOT NULL DEFAULT 18,
    company INTEGER,
    PRIMARY KEY (id)
);

Для того, чтобы при добавлении новых записей в таблицу Users гарантировать, что в колонке company находится идентификатор, существующий в таблице Companies, используется внешний ключ. Он имеет следующий синтаксис:

MySQL 8.4
FOREIGN KEY (столбец [, ...])
REFERENCES внешняя_таблица (столбец_внешней_таблицы [, ...])
[ON DELETE действие]
[ON UPDATE действие]
  • [ ]необязательная часть
  • ...можно повторить
столбец

Столбец этой таблицы, который ссылается на другую таблицу. Для составного ключа столбцы перечисляются через запятую.

внешняя_таблица
Таблица, на записи которой ссылается внешний ключ.
столбец_внешней_таблицы

Столбец внешней таблицы, с которым сверяются значения, обычно её первичный ключ. Столбцов столько же и в том же порядке, что и в FOREIGN KEY.

ON DELETE действие

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

Необязательный
RESTRICTCASCADESET NULLNO ACTION
ON UPDATE действие

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

Необязательный
RESTRICTCASCADESET NULLNO ACTION

Полный запрос для создания таблицы с внешним ключом будет таким:

MySQL 8.4
CREATE TABLE Users (
    id INTEGER,
    name VARCHAR(255) NOT NULL,
    age INTEGER NOT NULL DEFAULT 18,
    company INTEGER,
    PRIMARY KEY (id),
    FOREIGN KEY (company) REFERENCES Companies (id)
);

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

MySQL 8.4
CREATE TABLE Users (
    id INTEGER,
    name VARCHAR(255) NOT NULL,
    age INTEGER NOT NULL DEFAULT 18,
    company INTEGER,
    PRIMARY KEY (id),
    FOREIGN KEY (company) REFERENCES Companies (id)
    ON DELETE RESTRICT ON UPDATE CASCADE
);

ON DELETE RESTRICT означает, что если попробовать удалить компанию, у которой в таблице Users есть данные, база данных не даст этого сделать:

MySQL 8.4
Cannot delete or update a parent row: a foreign key constraint fails

Если бы было указано ON DELETE CASCADE, то при удалении компании были бы удалены все пользователи, ссылающиеся на эту компанию.

Есть ещё одна опция — ON DELETE SET NULL. При её использовании база данных запишет NULL в качестве значения поля company для всех пользователей, работавших в удалённой компании.

ON UPDATE CASCADE означает, что если компания изменит свой идентификатор, то все пользователи (Users) получат новый идентификатор в поле company.

Внешние ключи

Предположим, что мы хотим хранить данные о компании, в которой работают наши пользователи. Давайте создадим небольшую таблицу Companies, в которой мы будем хранить уникальный идентификатор и название компании:

MySQL 8.4
CREATE TABLE Companies (
    id INTEGER,
    name VARCHAR(255) NOT NULL,
    PRIMARY KEY (id)
);

Дальше нужно добавить в таблицу Users поле company – место работы нашего пользователя, которое будет ссылаться на запись в таблице Companies. Полный запрос для создания таблицы будет выглядеть так:

MySQL 8.4
CREATE TABLE Users (
    id INTEGER,
    name VARCHAR(255) NOT NULL,
    age INTEGER NOT NULL DEFAULT 18,
    company INTEGER,
    PRIMARY KEY (id)
);

Для того, чтобы при добавлении новых записей в таблицу Users гарантировать, что в колонке company находится идентификатор, существующий в таблице Companies, используется внешний ключ. Он имеет следующий синтаксис:

MySQL 8.4
FOREIGN KEY (столбец [, ...])
REFERENCES внешняя_таблица (столбец_внешней_таблицы [, ...])
[ON DELETE действие]
[ON UPDATE действие]
  • [ ]необязательная часть
  • ...можно повторить
столбец

Столбец этой таблицы, который ссылается на другую таблицу. Для составного ключа столбцы перечисляются через запятую.

внешняя_таблица
Таблица, на записи которой ссылается внешний ключ.
столбец_внешней_таблицы

Столбец внешней таблицы, с которым сверяются значения, обычно её первичный ключ. Столбцов столько же и в том же порядке, что и в FOREIGN KEY.

ON DELETE действие

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

Необязательный
RESTRICTCASCADESET NULLSET DEFAULTNO ACTION
ON UPDATE действие

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

Необязательный
RESTRICTCASCADESET NULLSET DEFAULTNO ACTION

Полный запрос для создания таблицы с внешним ключом будет таким:

MySQL 8.4
CREATE TABLE Users (
    id INTEGER,
    name VARCHAR(255) NOT NULL,
    age INTEGER NOT NULL DEFAULT 18,
    company INTEGER,
    PRIMARY KEY (id),
    FOREIGN KEY (company) REFERENCES Companies (id)
);

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

MySQL 8.4
CREATE TABLE Users (
    id INTEGER,
    name VARCHAR(255) NOT NULL,
    age INTEGER NOT NULL DEFAULT 18,
    company INTEGER,
    PRIMARY KEY (id),
    FOREIGN KEY (company) REFERENCES Companies (id)
    ON DELETE RESTRICT ON UPDATE CASCADE
);

ON DELETE RESTRICT означает, что если попробовать удалить компанию, у которой в таблице Users есть данные, база данных не даст этого сделать:

MySQL 8.4
ERROR:  update or delete on table "companies" violates foreign key constraint "users_company_fkey" on table "users"
DETAIL:  Key (id)=(1) is still referenced from table "users".

Если бы было указано ON DELETE CASCADE, то при удалении компании были бы удалены все пользователи, ссылающиеся на эту компанию.

Есть ещё одна опция — ON DELETE SET NULL. При её использовании база данных запишет NULL в качестве значения поля company для всех пользователей, работавших в удалённой компании.

ON UPDATE CASCADE означает, что если компания изменит свой идентификатор, то все пользователи (Users) получат новый идентификатор в поле company.

Удаление таблицы

Удаление таблицы производится при помощи оператора DROP TABLE.

MySQL 8.4
DROP TABLE [IF EXISTS] имя_таблицы;
  • [ ]необязательная часть
IF EXISTS

Не выдавать ошибку, если таблицы с таким именем нет.

Ключевое словоНеобязательный
имя_таблицы

Таблица, которую нужно удалить вместе со всеми её данными.

Интерактивное задание

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

Интерактивное упражнение недоступно

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

Перетащите элементы из правой панели в пропуски SQL-запроса, чтобы создать правильную таблицу Users

CREATE TABLE Users (
поле 1
тип 1
ключ
поле 2
тип 2
ограничение 2
поле 3
тип 3
ограничение 3
);
Названия полей:
id
name
age
email
created_at
Типы данных:
INTEGER
VARCHAR(255)
INTEGER AUTO_INCREMENT
TEXT
TIMESTAMP
Ограничения:
PRIMARY KEY
NOT NULL
NOT NULL DEFAULT 18
UNIQUE
DEFAULT CURRENT_TIMESTAMP

Требования к таблице:

  • Поле id: автоинкрементное целое число, первичный ключ
  • Поле name: строка до 255 символов, обязательное для заполнения
  • Поле age: целое число, обязательное, значение по умолчанию 18