INSERT INTO SQL: примеры вставки данных в таблицу

0
0

INSERT INTO - одна из команд языка SQL, позволяющая эффективно вставлять данные в таблицы баз данных. В этой статье мы разберем синтаксис оператора INSERT INTO на конкретных примерах, рассмотрим особенности вставки данных в разных СУБД, дадим полезные рекомендации по оптимизации производительности.

Общий синтаксис INSERT INTO

Оператор INSERT INTO используется в SQL для вставки новых строк в существующую таблицу базы данных. Основные элементы синтаксиса этой команды:

  • Ключевое слово INSERT INTO указывает, что мы хотим вставить данные в таблицу
  • После INTO указывается имя целевой таблицы, куда будут вставляться строки
  • Далее следует необязательный список столбцов таблицы в скобках, куда будут вставлены значения
  • Затем идет ключевое слово VALUES с набором вставляемых данных
  • Или вместо VALUES можно указать запрос SELECT, возвращающий вставляемые данные

Пример базового синтаксиса команды INSERT INTO:

 INSERT INTO table_name (column1, column2) VALUES (value1, value2); 

Этот запрос вставит одну строку со значениями value1 и value2 в указанные столбцы table_name.

Фото сверху города с небоскребами на рассвете

INSERT INTO с VALUES

Конструкция INSERT INTO с предложением VALUES позволяет вставить в таблицу одну строку данных, перечислив значения столбцов после VALUES:

 INSERT INTO users VALUES (1, 'John', 'john@example.com'); 

Здесь в таблицу users будет вставлена одна строка со значениями для столбцов id, name и email.

INSERT INTO с SELECT

Вместо VALUES в INSERT INTO можно указать запрос SELECT, который вернет данные для вставки:

 INSERT INTO users SELECT id, name, email FROM temp_users; 

В этом случае в таблицу users будут вставлены все строки, возвращенные запросом SELECT к таблице temp_users.

Фото монитора с командами INSERT на SQL

Работа с NULL значениями

Чтобы вставить NULL в определенный столбец, необходимо указать NULL вместо значения:

 INSERT INTO users VALUES (1, NULL, 'john@example.com'); 

Если столбец не указан явно в INSERT INTO, он получит NULL по умолчанию.

Временные таблицы с WITH

При вставке больших объемов данных удобно использовать временные таблицы с указанием WITH:

 WITH temporary_table AS ( SELECT * FROM table1 ) INSERT INTO real_table SELECT * FROM temporary_table; 

Это позволит оптимизировать запрос для лучшей производительности.

Вставка данных в конкретные столбцы

При использовании INSERT INTO можно явно указать список целевых столбцов, в которые будут вставлены значения:

 INSERT INTO table_name (column1, column3) VALUES (value1, value3); 

В этом случае значение value1 будет вставлено в column1, а value3 — в column3.

Преимущества указания столбцов

Явное указание целевых столбцов в INSERT INTO имеет несколько преимуществ:

  • Позволяет вставлять данные только в нужные столбцы, пропуская ненужные
  • Меняет порядок следования вставляемых значений
  • Дает больше контроля и защищает от ошибок при изменении структуры таблицы

Частичный список столбцов

Можно указать и частичный список целевых столбцов в INSERT INTO. Например:

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

В этом случае value3 будет вставлено в следующий по порядку столбец, не указанный явно в запросе.

Использование значений по умолчанию

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

Например, если столбец имеет значение по умолчанию 0, то при INSERT INTO этот столбец получит значение 0, даже если явно не указывать его в запросе.

Пример указания столбцов

Допустим, у нас есть таблица users со столбцами id, name, email, age. Мы хотим вставить данные только в столбцы name и email:

 INSERT INTO users (name, email) VALUES ('John Doe', 'john@example.com'); 

В результате в таблицу будет вставлена строка с указанными значениями name и email. Столбцы id и age получат значения по умолчанию.

Множественная вставка строк

Синтаксис INSERT INTO позволяет вставлять сразу несколько строк за один запрос, указав значения через запятую:

 INSERT INTO table_name VALUES (value_row1), (value_row2), (value_row3); 

Здесь после VALUES перечислены группы значений для трех отдельных строк, которые будут вставлены в указанную таблицу.

Разделение групп значений

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

 INSERT INTO users VALUES (1, 'John', 'john@example.com'), (2, 'Jane', 'jane@example.com'); 

Здесь мы вставляем 2 строки со значениями, разделенными запятыми в отдельные группы.

Ограничения на количество строк

В MySQL нет жесткого ограничения на максимальное число строк для INSERT INTO. Но на практике оптимально вставлять за раз не более 1000 строк.

Вставка больших объемов данных

Чтобы вставить большой объем данных, их нужно разбить на пакеты по 1000 строк:

 INSERT INTO table_name VALUES (row_values_1), ... (row_values_1000); INSERT INTO table_name VALUES (row_values_1001), ... (row_values_2000); 

Это позволит оптимизировать вставку данных в таблицу.

Вставка с проверкой уникальности

При вставке данных INSERT INTO проверяет ограничения целостности таблицы. При нарушении уникальности ключа возникнет ошибка и вставка не выполнится.

Чтобы избежать ошибки при дублировании ключа, можно использовать опцию INSERT IGNORE:

 INSERT IGNORE INTO table VALUES (1, 'Value'); 

При совпадении ключа INSERT IGNORE пропустит дублирующую строку, не возвращая ошибку.

REPLACE в MySQL

В MySQL есть опция REPLACE, которая заменит старую строку новой при дублировании PRIMARY KEY:

 REPLACE INTO table VALUES (1, 'New value'); 

REPLACE выполнит атомарную замену строки по ключу 1 на новое значение.

Пример INSERT IGNORE

Допустим, есть таблица users с первичным ключом id. Чтобы избежать ошибки при случайном дублировании id, используем INSERT IGNORE:

 INSERT IGNORE INTO users VALUES (1, 'John'), (1, 'Richard'); 

Первая строка будет вставлена, а повторяющаяся со значением id=1 - игнорирована. Так INSERT IGNORE помогает исключить ошибки при вставке данных.

Выражения и функции при вставке данных

INSERT INTO позволяет использовать выражения и функции для расчета вставляемых данных.

Например, чтобы сгенерировать уникальный идентификатор для столбца id, можно воспользоваться функцией UUID():

 INSERT INTO table (id, name) VALUES(UUID(), 'Name'); 

Функция UUID() вернет новый уникальный идентификатор для каждой вставляемой строки.

Примеры применения функций

Рассмотрим применение полезных функций в INSERT INTO:

  • NOW() - вставка текущей даты и времени
  • RAND() - генерация случайного числа
  • CONCAT() - объединение текстовых значений
  • UPPER() - приведение к верхнему регистру
 INSERT INTO table (created_at, value, name) VALUES (NOW(), RAND(), CONCAT('User ', UPPER(id))); 

Такие выражения позволяют гибко формировать вставляемые данные.

Рекомендации по оформлению

При использовании функций и выражений в INSERT INTO рекомендуется:

  • Разбивать длинные выражения на несколько строк для удобочитаемости
  • Комментировать назначение используемых выражений
  • Выносить часто используемые выражения в переменные или временные таблицы

Это упростит поддержку и понимание запросов.

Оптимизация производительности INSERT INTO

Чтобы ускорить выполнение больших INSERT INTO, рекомендуется:

  • Создать индексы по столбцам, используемым в запросе
  • Использовать отложенную вставку данных с опцией INSERT DELAYED
  • Вставлять данные пакетами по 1000 строк
  • Предварительно сортировать данные в порядке столбцов таблицы