Добавление данных, оператор INSERT
Для добавления новых записей в таблицу предназначен оператор INSERT. Рассмотрим его общую структуру.
Общая структура запроса с оператором INSERT
INSERT INTO имя_таблицы [(поле_таблицы, ...)] VALUES (значение_поля_таблицы, ...) | SELECT поле_таблицы, ... FROM имя_таблицы ...
Значения можно вставлять перечислением с помощью слова VALUES, перечислив их в круглых скобках через запятую или c помощью оператора SELECT.
Таким образом, добавить новые записи можно следующими способами:
-
Используя синтаксис INSERT INTO ... SELECT
INSERT INTO Goods (good_id, good_name, type) SELECT 20, 'Table', 2;
-
Используя синтаксис INSERT INTO ... VALUES (...)
INSERT INTO Goods (good_id, good_name, type) VALUES (20, 'Table', 2);
Каждый из этих запросов даст одинаковый результат:
Первичный ключ при добавлении новой записи
Следует помнить, что первичный ключ таблицы является уникальным значением и добавление уже существующего значения приведёт к ошибке.
При добавлении новой записи с уникальными индексами выбор такого уникального значения может оказаться непростой задачей. Решением может быть дополнительный запрос, направленный на выявление максимального значения первичного ключа для генерации нового уникального значения.
INSERT INTO Goods SELECT MAX(good_id) + 1, 'Table', 2 FROM Goods;
Здесь мы используем функцию MAX для получения максимального значения первичного ключа. Однако, это не самый надёжный и универсальный способ вычисления значения первичного ключа, потому что он лучше всего работает только с числовым типом данных, для всех остальных реализация будет нетривиальной. А ещё таким способом можно получить значение, которое уже ранее существовало в таблице, но было удалено. Это может привести к неконсистентности данных в системе 💥, поэтому в реальных проектах рекомендуется использовать альтернативный метод.
MySQL
В MySQL введён механизм его автоматической генерации. Для этого достаточно снабдить первичный ключ good_id атрибутом AUTO_INCREMENT. Тогда при создании новой записи в качестве значения good_id достаточно передать NULL или 0 — поле автоматически получит значение, большее предыдущего на единицу.
CREATE TABLE Goods ( good_id INT NOT NULL AUTO_INCREMENT ... );
INSERT INTO Goods VALUES (NULL, 'Table', 2);
PostgreSQL
В PostgreSQL есть схожий механизм для автоматической генерации уникального идентификатора. Для этого он имеет типы SMALLSERIAL, SERIAL, BIGSERIAL, которые не являются настоящими типами, а скорее просто удобством записи столбцов с уникальным идентификатором. Столбец с одним из вышеперечисленных типов будет являться целочисленным и автоматически увеличиваться при добавлении новой записи.
CREATE TABLE Goods ( good_id SERIAL ... );
INSERT INTO Goods (good_name, type) VALUES ('Table', 2);