Добавление данных, оператор INSERT

Для добавления новых записей в таблицу предназначен оператор INSERT. Рассмотрим его общую структуру.

Общая структура запроса с оператором INSERT

MySQL
INSERT INTO имя_таблицы [(поле_таблицы, ...)]
VALUES (значение_поля_таблицы, ...)
| SELECT поле_таблицы, ... FROM имя_таблицы ...

Значения можно вставлять перечислением с помощью слова VALUES, перечислив их в круглых скобках через запятую или c помощью оператора SELECT.

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

  • Используя синтаксис INSERT INTO ... SELECT

    MySQL
    INSERT INTO Goods (good_id, good_name, type)
    SELECT 20, 'Table', 2;
    
  • Используя синтаксис INSERT INTO ... VALUES (...)

    MySQL
    INSERT INTO Goods (good_id, good_name, type)
    VALUES (20, 'Table', 2);
    

Каждый из этих запросов даст одинаковый результат:

good_idgood_nametype
1apartment fee1
2phone fee1
3bread2
4milk2
5red caviar3
6cinema4
7black caviar3
8cough tablets5
9potato2
10pineapples3
11television8
12vacuum cleaner8
13jacket7
14fur coat7
15music school fee6
16english school fee6
20Table2

Первичный ключ при добавлении новой записи

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

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

MySQL
INSERT INTO Goods SELECT MAX(good_id) + 1, 'Table', 2 FROM Goods;

Здесь мы используем функцию MAX для получения максимального значения первичного ключа. Однако, это не самый надёжный и универсальный способ вычисления значения первичного ключа, потому что он лучше всего работает только с числовым типом данных, для всех остальных реализация будет нетривиальной. А ещё таким способом можно получить значение, которое уже ранее существовало в таблице, но было удалено. Это может привести к неконсистентности данных в системе 💥, поэтому в реальных проектах рекомендуется использовать альтернативный метод.

MySQL

В MySQL введён механизм его автоматической генерации. Для этого достаточно снабдить первичный ключ good_id атрибутом AUTO_INCREMENT. Тогда при создании новой записи в качестве значения good_id достаточно передать NULL или 0 — поле автоматически получит значение, большее предыдущего на единицу.

MySQL
CREATE TABLE Goods (
	good_id INT NOT NULL AUTO_INCREMENT
	...
);
MySQL
INSERT INTO Goods VALUES (NULL, 'Table', 2);

PostgreSQL

В PostgreSQL есть схожий механизм для автоматической генерации уникального идентификатора. Для этого он имеет типы SMALLSERIAL, SERIAL, BIGSERIAL, которые не являются настоящими типами, а скорее просто удобством записи столбцов с уникальным идентификатором. Столбец с одним из вышеперечисленных типов будет являться целочисленным и автоматически увеличиваться при добавлении новой записи.

MySQL
CREATE TABLE Goods (
	good_id SERIAL
	...
);
MySQL
INSERT INTO Goods (good_name, type) VALUES ('Table', 2);