SQL стейтмент INSERT INTO

Материал из Энциклопедия о программировании
Перейти к: навигация, поиск

INSERT INTO (сокр. INSERT) — SQL-стейтмент вставки кортежей в отношение, т.е., неформально говоря, это SQL-оператор для вставки данных в таблицу БД; конструкция/команда, используемая для добавления новых записей/строк/рядов в таблицу базы данных.

Разница между вставкой и обновлением

Этот раздел также можно назвать, или альтернативные заголовки раздела:
  • Разница между INSERT и UPDATE

SQL стейтмент INSERT INTO только вставляет новые записи (строки, ряды) в существующую таблицу, а не вставляет новые значения в ячейки существующих записей (строк, рядов). Вставкой новых значений в ячейки существующих записей (строк, рядов) в SQL занимается оператор обновления UPDATE.

Виды вставки

SQL стейтмент INSERT INTO поддерживает вставку данных в двух видах: вставка данных по значениям и вставка по выборке.

Вставка по значениям

Вставка по значениям предусматривает следующий синтаксис INSERT … VALUES. Производить вставки таким образом можно в двух формах: полная и сокращённая. При полной форме помимо самого названия таблицы так же указываются столбцы таблицы в которые вставляются данные, при сокращенной столбцы не указывается. Для каждой из форм доступна множественная вставка, при которой ряды со значениями (круглые скобки) перечисляются через запятую.

Вставка по запросу

Вставка по запросу предусматривает след. синтаксис: INSERT … SELECT. Т.е. сначала данные вытаскиваются из одной таблицы, а затем они вставляются в др. таблицу. При этом должны быть соблюдены след. условия:

  • количество значений в строке (число столбцов) полученной по запросу должно совпадать с количеством столбцов при вставке;
  • типы данных должны совпадать;
  • названия столбцов роли не играют.

Синтаксис

Синтаксис SQL-оператора INSERT INTO двух типов:

  1. Вставка по значениям
  2. Вставка по запросу

Вставка по значениям

Одиночная вставка с указанием имён столбцов

Полная форма одиночной вставки определяет как имена столбцов, так и значения для вставки:

INSERT INTO `table_name` (`column1`, `column2`, `column3`, …)
VALUES (value1, value2, value3, …);

Одиночная вставка без указания имён столбцов

Сокращённая форма вставки не определяет имена столбцов, куда данные будут вставлены, а только перечисляет значения. При этом заданные значения будут записаны в столбцы точно по порядковому номеру каждого конкретного значения, то есть порядковый номер столбца таблицы будет сопоставлен с порядковым номером значения в запросе. Пример формы сокращённой вставки одного ряда (одной строки) значений:

INSERT INTO `table_name`
VALUES (value1, value2, value3, …);

Множественная вставка без указания имён столбцов

В операторе INSERT допускается вставка множества рядов в одном запросе — множественная вставка. Каждый новый ряд пишется в отдельных скобках, скобки отделяются друг от друга запятыми. Вставка нескольких значений за раз, множественная вставка:

INSERT INTO `table_name`
VALUES (value1, value2, value3, …), (value1, value2, value3, …), (value1, value2, value3, …);

При этом ошибка при вставке одного ряда повлечёт полное прекращение работы оператора, то есть все остальные ряды не будут вставлены вне зависимости от их корректности и правильности.

Пропуск ошибок, оператор IGNORE

Для того, чтобы игнорировать ошибки при вставке одной строки и продолжать работу оператора используется SQL-оператор IGNORE. Ключевое слово IGNORE заставляет пропускать ошибки и продолжать выполнение SQL-оператора INSERT. С использованием IGNORE SQL запрос множественной вставки данных выглядит следующим образом:

INSERT IGNORE INTO `table_name` VALUES
(value1, value2, value3, …),
(value1, value2, value3, …),
(value1, value2, value3, …),
…
(value1, value2, value3, …);

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

Вставка по запросу

INSERT INTO `table` (`column1`,`column2`,`column3`, …)
SELECT `column1`,`column2`,`column3`, … FROM `table_name`;

Данные сначала запрашиваются (вытаскиваются) и потом вставляются. Соблюдать последовательность столбцов и типов данных строго обязательно.

Возвращаемые значения

Сам SQL стейтмент INSERT INTO ничего не возвращает, а только вставляет данные в БД, но при комбинировании его с другими операторами (в некоторых СУБД) можно получить данные о вставленных строках.

После обновления или вставки данных в базу в большинстве СУБД есть возможность легко стандартными методами узнать уникальный идентификатор (id) автоматически присвоенный новой записи. В СУБД MySQL id вставленной или обновлённой записи возвращает функция LAST_INSERT_ID(), она используется в соответствующих функциях и методах -обёртках во всех библиотеках-коннекторах для конкретных языков программирования. По-умолчанию функция LAST_INSERT_ID() возвращает 0. Важно понимать, что функция LAST_INSERT_ID() вернёт вставленное значение только, если новые данные реально были добавлены в БД. Если данные уже были в БД, и они не были изменены, но использовался оператор типа «INSERT IGNORE», который корректно завершает запрос, то функция LAST_INSERT_ID() не вернёт id существующей записи, она вернёт по-прежнему 0. Т.е. с использованием уникального ключа перед вставкой данных надо проверять существование этих данных в БД и функция LAST_INSERT_ID() тут не поможет.

Пример использования функции LAST_INSERT_ID():

SELECT LAST_INSERT_ID();

Возможные ошибки

SQL стейтмент INSERT INTO может вызывать определённые ошибки: напр., если на столбце стоит ограничение уникального ключа и вставляемое значение в нём уже имеется, то SQL-запрос не завершится успешно (корректно) т.к. SQL стейтмент INSERT INTO вызовет ошибку «Ошибка SQL 1062: Duplicate entry 'value' for key 'key'». Чтобы избежать подобных ошибок, которые некорректно завершают SQL-запрос, используется оператор (ключевое слово) IGNORE, которое заставляет игнорировать ошибки. Пример:

INSERT IGNORE INTO `table` (`col`) VALUES ('val');

Практика

Как правило, в больших дампах применяются множественные вставки, которые содержат все элементы таблицы в одном SQL запросе INSERT.

Примеры

Хрестоматийные примеры

Список наглядных примеров всех 4-ёх видов синтаксиса SQL-оператора INSERT INTO:

Включение имён полей в одном выражении INSERT INTO
INSERT INTO tbl_name (col_A, col_B, col_C) VALUES (1, 2, 3);

Включение нескольких строк выражении INSERT INTO без указания имён полей

INSERT INTO tbl_name VALUES (1, 2, 3), (4, 5, 6), (7, 8, 9);

Включение нескольких строк выражении INSERT INTO с одним указанием имён полей

INSERT INTO tbl_name (col_A, col_B, col_C) VALUES (1, 2, 3), (4, 5, 6), (7, 8, 9);

Включение одной строки в выражении INSERT INTO без указания имён полей

INSERT INTO tbl_name VALUES (1, 2, 3);

Кастомные примеры

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

INSERT INTO authors VALUES (1, 'Maks', '123', 'maks@email.loc', 'site', '', 'programmer', '', '', '', 0, 0);
INSERT INTO authors VALUES (2, 'Igor', '123', 'igor@email.loc', 'site', '', 'programmer', '', '', '', 407, 0);
INSERT INTO authors VALUES (3, 'Sergey', '212', 'sergey@email.loc', 'site', '', 'designer', '', '', '', 408, 0);

Эта статья относится к языку SQL.