Создание и удаление таблиц
Создание таблицы
Перед созданием таблицы необходимо выбрать базу данных, в которую таблица будет записана. Это делается с помощью оператора USE:
USE имя_базы_данных;- имя_базы_данных
- База данных, в которой будут создаваться таблицы.
Для создания таблицы используется оператор CREATE TABLE. Его базовый синтаксис имеет следующий вид:
CREATE TABLE [IF NOT EXISTS] имя_таблицы (
столбец тип_данных [, ...]
);- [ ]необязательная часть
- ...можно повторить
- IF NOT EXISTS
Не создавать таблицу, если таблица с таким именем уже есть. Без этой части запрос в таком случае завершится ошибкой.
Ключевое словоНеобязательный- имя_таблицы
- Имя новой таблицы.
- столбец
Имя столбца. Пар столбец тип_данных может быть несколько, через запятую.
- тип_данных
Какие значения хранит столбец, например INTEGER для чисел или VARCHAR(255) для строк.
Например, создадим таблицу пользователей.
MySQL 8.4CREATE TABLE Users ( id INTEGER, name VARCHAR(255), age INTEGER );
MySQL 8.4CREATE 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.4CREATE TABLE Users ( id INTEGER PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255) NOT NULL, age INTEGER NOT NULL DEFAULT 18 );
MySQL 8.4CREATE 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.4CREATE TABLE Users ( id INTEGER PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
MySQL 8.4CREATE TABLE Users ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
Описание таблицы
Для того чтобы посмотреть описание созданной таблицы, можно воспользоваться оператором DESCRIBE.
MySQL 8.4DESCRIBE Users;
Для того чтобы посмотреть описание созданной таблицы, можно воспользоваться SQL запросом к информационной схеме:
MySQL 8.4SELECT column_name, data_type, is_nullable, column_default FROM information_schema.columns WHERE table_schema = current_schema() AND table_name = 'users';
Дополнительные параметры определения таблицы
Помимо описания столбцов, при создании таблицы можно дополнительно указать следующие параметры:
Первичный ключ
Если вы не определили первичный ключ с помощью параметров столбца, то это можно сделать с помощью дополнительных параметров таблицы, добавив запись PRIMARY KEY (столбец [, ...]) после перечисления столбцов:
MySQL 8.4CREATE TABLE Users ( id INTEGER, name VARCHAR(255) NOT NULL, age INTEGER NOT NULL DEFAULT 18, PRIMARY KEY (id) );
Первичный ключ
Если вы не определили первичный ключ с помощью параметров столбца, то это можно сделать с помощью дополнительных параметров таблицы, добавив запись PRIMARY KEY (столбец [, ...]) после перечисления столбцов:
MySQL 8.4CREATE TABLE Users ( id INTEGER, name VARCHAR(255) NOT NULL, age INTEGER NOT NULL DEFAULT 18, PRIMARY KEY (id) );
Внешние ключи
Предположим, что мы хотим хранить данные о компании, в которой работают наши пользователи. Давайте создадим небольшую таблицу Companies, в которой мы будем хранить уникальный идентификатор и название компании:
MySQL 8.4CREATE TABLE Companies ( id INTEGER, name VARCHAR(255) NOT NULL, PRIMARY KEY (id) );
Дальше нужно добавить в таблицу Users поле company – место работы нашего пользователя, которое будет ссылаться на запись в таблице Companies. Полный запрос для создания таблицы будет выглядеть так:
MySQL 8.4CREATE TABLE Users ( id INTEGER, name VARCHAR(255) NOT NULL, age INTEGER NOT NULL DEFAULT 18, company INTEGER, PRIMARY KEY (id) );
Для того, чтобы при добавлении новых записей в таблицу Users гарантировать, что в колонке company находится идентификатор, существующий в таблице Companies, используется внешний ключ. Он имеет следующий синтаксис:
FOREIGN KEY (столбец [, ...])
REFERENCES внешняя_таблица (столбец_внешней_таблицы [, ...])
[ON DELETE действие]
[ON UPDATE действие]- [ ]необязательная часть
- ...можно повторить
- столбец
Столбец этой таблицы, который ссылается на другую таблицу. Для составного ключа столбцы перечисляются через запятую.
- внешняя_таблица
- Таблица, на записи которой ссылается внешний ключ.
- столбец_внешней_таблицы
Столбец внешней таблицы, с которым сверяются значения, обычно её первичный ключ. Столбцов столько же и в том же порядке, что и в FOREIGN KEY.
- ON DELETE действие
Что сделать с записями этой таблицы, когда удаляют запись, на которую они ссылаются.
НеобязательныйRESTRICTCASCADESET NULLNO ACTION- ON UPDATE действие
Что сделать с записями этой таблицы, когда меняется значение, на которое они ссылаются.
НеобязательныйRESTRICTCASCADESET NULLNO ACTION
Полный запрос для создания таблицы с внешним ключом будет таким:
MySQL 8.4CREATE 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.4CREATE 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.4Cannot 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.4CREATE TABLE Companies ( id INTEGER, name VARCHAR(255) NOT NULL, PRIMARY KEY (id) );
Дальше нужно добавить в таблицу Users поле company – место работы нашего пользователя, которое будет ссылаться на запись в таблице Companies. Полный запрос для создания таблицы будет выглядеть так:
MySQL 8.4CREATE TABLE Users ( id INTEGER, name VARCHAR(255) NOT NULL, age INTEGER NOT NULL DEFAULT 18, company INTEGER, PRIMARY KEY (id) );
Для того, чтобы при добавлении новых записей в таблицу Users гарантировать, что в колонке company находится идентификатор, существующий в таблице Companies, используется внешний ключ. Он имеет следующий синтаксис:
FOREIGN KEY (столбец [, ...])
REFERENCES внешняя_таблица (столбец_внешней_таблицы [, ...])
[ON DELETE действие]
[ON UPDATE действие]- [ ]необязательная часть
- ...можно повторить
- столбец
Столбец этой таблицы, который ссылается на другую таблицу. Для составного ключа столбцы перечисляются через запятую.
- внешняя_таблица
- Таблица, на записи которой ссылается внешний ключ.
- столбец_внешней_таблицы
Столбец внешней таблицы, с которым сверяются значения, обычно её первичный ключ. Столбцов столько же и в том же порядке, что и в FOREIGN KEY.
- ON DELETE действие
Что сделать с записями этой таблицы, когда удаляют запись, на которую они ссылаются.
НеобязательныйRESTRICTCASCADESET NULLSET DEFAULTNO ACTION- ON UPDATE действие
Что сделать с записями этой таблицы, когда меняется значение, на которое они ссылаются.
НеобязательныйRESTRICTCASCADESET NULLSET DEFAULTNO ACTION
Полный запрос для создания таблицы с внешним ключом будет таким:
MySQL 8.4CREATE 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.4CREATE 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.4ERROR: 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.
DROP TABLE [IF EXISTS] имя_таблицы;- [ ]необязательная часть
- IF EXISTS
Не выдавать ошибку, если таблицы с таким именем нет.
Ключевое словоНеобязательный- имя_таблицы
Таблица, которую нужно удалить вместе со всеми её данными.
Интерактивное задание
Теперь, когда вы изучили основы создания таблиц, попробуйте закрепить материал с помощью интерактивного задания:
Интерактивное упражнение недоступно
Для использования интерактивного упражнения необходим экран шириной не менее 600 пикселей. Попробуйте открыть эту страницу на компьютере или планшете.
Перетащите элементы из правой панели в пропуски SQL-запроса, чтобы создать правильную таблицу Users
Названия полей:
Типы данных:
Ограничения:
Требования к таблице:
- Поле id: автоинкрементное целое число, первичный ключ
- Поле name: строка до 255 символов, обязательное для заполнения
- Поле age: целое число, обязательное, значение по умолчанию 18