
Инструкция INSERT добавляет новые строки в таблицу базы данных. Она используется при создании записей в таблицах справочников, регистрах, журналах событий и других структурах, где требуется сохранение данных. Команда поддерживается всеми SQL-совместимыми системами, включая MySQL, PostgreSQL, SQLite, SQL Server и Oracle.
Основная форма команды выглядит так: INSERT INTO таблица (столбец1, столбец2, …) VALUES (значение1, значение2, …). Важно соблюдать порядок перечисления столбцов и значений, чтобы избежать ошибок несоответствия типов данных. При вставке можно использовать как текстовые, так и числовые, логические и временные значения. Для строковых полей значения заключаются в одинарные кавычки, для числовых – записываются напрямую.
Если таблица содержит автоинкрементное поле, его можно не указывать в списке столбцов – база данных назначит значение автоматически. При необходимости вставки сразу нескольких строк можно применить синтаксис с множественными наборами VALUES. Такой подход снижает нагрузку на сервер и ускоряет массовое добавление данных.
Команда INSERT также позволяет вставлять результаты запроса, используя конструкцию INSERT INTO таблица SELECT …. Это удобно при копировании данных между таблицами или создании резервных копий. Корректная работа с этой инструкцией требует понимания структуры таблицы и ограничений, установленных на уровне схемы.
Синтаксис команды INSERT INTO для одной таблицы

Команда INSERT INTO используется для добавления новой строки данных в существующую таблицу. В базовом виде она содержит имя таблицы, список столбцов и набор значений, которые вставляются в эти столбцы. Каждый столбец должен соответствовать своему типу данных – числовому, строковому, логическому или временному.
Общий синтаксис команды выглядит так:
| Элемент | Описание |
|---|---|
| INSERT INTO | Указывает, в какую таблицу будут добавлены данные |
| (столбец1, столбец2, …) | Перечень столбцов, в которые вставляются значения |
| VALUES (значение1, значение2, …) | Список вставляемых значений, соответствующих каждому столбцу |
Пример вставки данных в таблицу users с указанием конкретных полей:
INSERT INTO users (name, email, age) VALUES ('Иван', 'ivan@example.com', 28);
Если значения добавляются во все столбцы таблицы в правильном порядке, список столбцов можно опустить:
INSERT INTO users VALUES (1, 'Иван', 'ivan@example.com', 28);
Такой вариант применяется только при полном соответствии количества и порядка значений структуре таблицы. Если структура изменится, запрос потребуется обновить вручную. Для стабильности рекомендуется всегда указывать имена столбцов явно.
Добавление одной строки с указанием всех столбцов

Для точного добавления данных рекомендуется указывать все столбцы таблицы. Синтаксис позволяет избежать ошибок при изменении структуры таблицы и гарантирует корректное распределение значений.
Пример для таблицы customers с полями id, name, email, signup_date:
INSERT INTO customers (id, name, email, signup_date) VALUES (1, 'Иван Иванов', 'ivan@example.com', '2025-10-24');
Важно соблюсти порядок столбцов, соответствующий передаваемым значениям. Любое несоответствие вызовет ошибку выполнения.
Если таблица содержит автоинкрементное поле, его можно исключить из списка столбцов:
INSERT INTO customers (name, email, signup_date) VALUES ('Мария Петрова', 'maria@example.com', '2025-10-24');
Использование полного списка столбцов повышает читаемость запроса и облегчает поддержку кода при изменениях структуры базы данных.
Вставка данных только в выбранные столбцы

Команда INSERT позволяет добавлять значения не во все столбцы таблицы, а только в конкретные. Для этого после имени таблицы указываются имена столбцов в скобках, а затем соответствующие значения в том же порядке. Пример для таблицы users с колонками id, name, email:
INSERT INTO users (name, email) VALUES ('Иван Иванов', 'ivan@mail.com');
В данном случае столбец id пропускается, предполагается, что он автоматически генерируется (например, с помощью AUTO_INCREMENT). Если пропустить обязательный столбец без значения по умолчанию, база данных выдаст ошибку.
Можно вставлять данные в произвольный набор столбцов, главное – соблюсти порядок значений. Например, для таблицы products с колонками product_id, name, price, stock:
INSERT INTO products (name, price) VALUES ('Кофеварка', 4500);
Столбец stock будет заполнен значением по умолчанию или NULL, если это разрешено схемой таблицы. Такой подход упрощает работу с таблицами, где большинство столбцов имеют значения по умолчанию или автоматически вычисляются.
При массовой вставке данных допустимо использовать несколько строк:
INSERT INTO users (name, email) VALUES ('Петр Петров', 'petr@mail.com'), ('Анна Смирнова', 'anna@mail.com');
Важно следить за типами данных и обязательными столбцами, чтобы не нарушить ограничения целостности таблицы. Использование выборочной вставки повышает гибкость и уменьшает вероятность ошибок при добавлении частичных данных.
Использование VALUES для добавления нескольких строк сразу
Команда INSERT INTO позволяет добавить сразу несколько строк в таблицу с помощью конструкции VALUES. Формат выглядит так:
INSERT INTO имя_таблицы (столбец1, столбец2, столбец3)
VALUES
(значение1_1, значение1_2, значение1_3),
(значение2_1, значение2_2, значение2_3),
(значение3_1, значение3_2, значение3_3);
Пример для таблицы products с колонками name, price, quantity:
INSERT INTO products (name, price, quantity)
VALUES
('Яблоко', 10, 50),
('Банан', 15, 30),
('Апельсин', 20, 25);
Рекомендации при добавлении нескольких строк:
- Указывать все необходимые столбцы, чтобы избежать ошибок с
NOT NULLи автоинкрементными полями. - Следить за порядком значений, он должен точно соответствовать списку столбцов.
- Не превышать ограничение СУБД на количество строк в одном запросе, для больших объемов данных использовать пакетную вставку или
LOAD DATA. - Использовать одинарные кавычки для текстовых данных, числа указываются без кавычек.
Добавление нескольких строк за один запрос ускоряет выполнение операций и снижает нагрузку на сервер по сравнению с последовательными отдельными INSERT.
Вставка данных из другой таблицы с помощью INSERT SELECT

Команда INSERT SELECT позволяет перенести данные из одной таблицы в другую без необходимости вручную перечислять каждую запись. Основной синтаксис выглядит так:
INSERT INTO целевая_таблица (столбец1, столбец2, …) SELECT столбецA, столбецB, … FROM исходная_таблица WHERE условие;
Количество и порядок столбцов в INSERT INTO должны соответствовать выбранным столбцам в SELECT. Несоответствие приведет к ошибке.
Пример переноса пользователей из таблицы old_users в new_users, сохранив только активные записи:
INSERT INTO new_users (id, name, email) SELECT id, name, email FROM old_users WHERE status = ‘active’;
Для объединения данных с преобразованием можно использовать функции SQL. Например, склеивание имени и фамилии перед вставкой:
INSERT INTO employees_fullname (id, fullname) SELECT id, CONCAT(first_name, ‘ ‘, last_name) FROM employees;
Если требуется избежать дублирования, применяют WHERE NOT EXISTS или LEFT JOIN для проверки существующих записей:
INSERT INTO new_table (id, value) SELECT id, value FROM old_table o WHERE NOT EXISTS (SELECT 1 FROM new_table n WHERE n.id = o.id);
Для больших объемов данных рекомендуется выполнять вставку партиями с ограничением через LIMIT или использовать транзакции для сохранения целостности.
INSERT SELECT подходит для миграции, резервного копирования и синхронизации таблиц без промежуточной обработки данных на уровне приложения.
Добавление записей с автоинкрементным идентификатором
Автоинкрементные поля обычно применяются для уникальной идентификации записей. В SQL их задают через тип данных с атрибутом AUTO_INCREMENT в MySQL или SERIAL в PostgreSQL.
Пример создания таблицы с автоинкрементным идентификатором в MySQL:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(100)
);
Для добавления записи в таблицу с автоинкрементным идентификатором указывать поле id не обязательно. База данных сама присвоит уникальное значение:
INSERT INTO users (name, email)
VALUES ('Иван Иванов', 'ivan@example.com');
Для добавления нескольких строк одновременно:
INSERT INTO users (name, email)
VALUES
('Мария Петрова', 'maria@example.com'),
('Сергей Смирнов', 'sergey@example.com');
Если нужно получить присвоенный идентификатор после вставки, используют:
- MySQL:
LAST_INSERT_ID() - PostgreSQL:
RETURNING id
Пример для PostgreSQL:
INSERT INTO users (name, email)
VALUES ('Алексей Кузнецов', 'aleksey@example.com')
RETURNING id;
Важно учитывать ограничения автоинкремента:
- Нельзя вручную вставлять значения, которые нарушают уникальность.
- При удалении записей идентификаторы не переиспользуются автоматически.
- Для больших таблиц рекомендуется проверять диапазон INT или BIGINT, чтобы избежать переполнения.
Работа с NULL при вставке данных
В SQL значение NULL обозначает отсутствие данных. При использовании команды INSERT его можно явно указывать для столбцов, где допустимы пустые значения. Например:
INSERT INTO employees (name, department_id, hire_date) VALUES ('Иванов', NULL, '2025-10-24');
Если столбец допускает NULL, его можно опустить в списке столбцов. В этом случае база данных автоматически присвоит NULL этому полю:
INSERT INTO employees (name, hire_date) VALUES ('Петров', '2025-10-24');
Для столбцов с ограничением NOT NULL попытка вставить NULL приведет к ошибке. Проверяйте ограничения таблицы перед вставкой данных.
При работе с функциями и вычислениями в INSERT NULL обрабатывается особым образом. Любое арифметическое или строковое выражение с NULL также возвращает NULL:
INSERT INTO salaries (employee_id, bonus) VALUES (1, NULL + 1000); – результатом будет NULL в поле bonus.
Для явной замены NULL используют функцию COALESCE:
INSERT INTO salaries (employee_id, bonus) VALUES (1, COALESCE(NULL, 0)); – в поле bonus будет записан 0 вместо NULL.
Использование DEFAULT также позволяет обходить NULL, если для столбца задано значение по умолчанию:
INSERT INTO employees (name, department_id) VALUES ('Сидоров', DEFAULT); – столбец department_id получит значение по умолчанию.
При массовой вставке через INSERT SELECT важно проверять, чтобы источники данных корректно обрабатывали NULL, иначе возможны ошибки или некорректные записи.
Типичные ошибки при использовании INSERT и способы их избежать

Ошибка: Несоответствие типов данных. Часто пытаются вставить текст в числовой столбец или дату в текстовое поле. Решение: проверяйте типы столбцов с помощью команды DESCRIBE имя_таблицы и приводите значения к нужному формату перед вставкой.
Ошибка: Нарушение ограничений уникальности. Попытка вставить дублирующийся ключ приводит к ошибке. Решение: использовать INSERT IGNORE или ON DUPLICATE KEY UPDATE для пропуска или обновления существующих записей.
Ошибка: Пропуск обязательных столбцов. Если столбец объявлен как NOT NULL, вставка без значения вызовет сбой. Решение: указывать все обязательные поля или задавать значения по умолчанию.
Ошибка: Некорректная работа с NULL. Вставка пустой строки вместо NULL может нарушить целостность данных. Решение: использовать явное NULL для отсутствующих значений.
Ошибка: Конфликт автоинкрементных значений. Вставка явного значения в столбец AUTO_INCREMENT может вызвать ошибку или сбой последовательности. Решение: оставлять автоинкрементное поле пустым при добавлении новой записи.
Ошибка: Неправильное количество столбцов и значений. Количество перечисленных столбцов должно совпадать с количеством значений. Решение: тщательно проверять списки столбцов и VALUES и использовать явное указание столбцов.
Ошибка: Проблемы с кодировкой. Вставка текста с неподдерживаемой кодировкой вызывает искажение данных. Решение: устанавливать одинаковую кодировку для таблицы и клиентского соединения, например, UTF-8.
Ошибка: Использование INSERT в цикле без оптимизации. Множественные отдельные вставки снижают производительность. Решение: использовать пакетное добавление через INSERT VALUES (...), (...), (...) или INSERT SELECT.
Вопрос-ответ:
Как вставить одну строку в таблицу с помощью INSERT?
Для добавления одной строки используется синтаксис INSERT INTO имя_таблицы (столбец1, столбец2, ...) VALUES (значение1, значение2, ...);. Все перечисленные столбцы должны соответствовать порядку значений. Если некоторые столбцы допускают NULL или имеют значение по умолчанию, их можно не указывать.
Можно ли вставить сразу несколько строк в одну таблицу?
Да, SQL позволяет добавить несколько записей одним запросом. Для этого после ключевого слова VALUES перечисляют несколько наборов значений через запятую, например: INSERT INTO таблица (столбец1, столбец2) VALUES (1, 'A'), (2, 'B'), (3, 'C');. Такой подход сокращает количество обращений к базе и ускоряет вставку данных.
Как добавить данные только в отдельные столбцы таблицы?
Если необходимо заполнить не все столбцы, достаточно указать только нужные: INSERT INTO таблица (столбец1, столбец3) VALUES (значение1, значение3);. Остальные столбцы получат значение по умолчанию или NULL, если это разрешено структурой таблицы.
Как работает вставка данных с автоинкрементным идентификатором?
Для столбцов с автоинкрементом можно не указывать значение при вставке. Например, если столбец id настроен как автоинкремент, запрос INSERT INTO таблица (имя, возраст) VALUES ('Иван', 25); автоматически присвоит следующему ряду уникальный идентификатор. Это упрощает управление ключами и предотвращает конфликты при добавлении новых записей.
Можно ли вставить данные из одной таблицы в другую?
Да, используется конструкция INSERT INTO таблица_назначения (столбец1, столбец2) SELECT столбец1, столбец2 FROM таблица_источник WHERE условие;. Это позволяет копировать записи между таблицами или преобразовывать данные на этапе вставки. Фильтрация через WHERE помогает выбрать только нужные строки.
