Совмещаем MySQL INSERT INTO, VALUES и SELECT в одном запросе

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для внесения данных с помощью запроса SELECT используется конструкция INSERT INTO целевая_таблица (колонки) SELECT значения FROM источник_таблица WHERE условия. Вот пример кода:

SQL
Скопировать код
INSERT INTO целевая_таблица (кол1, кол2)
SELECT кол1, кол2
FROM источник_таблица
WHERE фильтр_условие;

Такой запрос передает данные из колонок кол1 и кол2 из источник_таблица в целевая_таблица по заданному фильтр_условие.

Кинга Идем в IT: пошаговый план для смены профессии

Комбинирование статических данных с результатом SELECT

В некоторых ситуациях требуется сочетать предопределенные статичные данные с результатами, получаемыми c помощью SELECT, при их внесении в таблицу. Пример этого процесса:

SQL
Скопировать код
INSERT INTO целевая_таблица (кол1, кол2, кол3)
SELECT кол1, кол2, 'статичное_значение'
FROM источник_таблица
WHERE определенное_условие;

В данном случае кол3 последовательно получает статичное значение 'статичное_значение' при каждой вставке строки, что дает возможность комбинирования статических и динамических данных.

Устранение проблемы дубликатов при вставке

Появление дубликатов может серьезно нарушить целостность данных. Чтобы не допустить добавление повторяющихся данных, можно использовать INSERT IGNORE. С другой стороны, если необходимо обновить уже существующие записи, применяйте ON DUPLICATE KEY UPDATE.

SQL
Скопировать код
INSERT INTO целевая_таблица (id, данные)
SELECT источник_id, источник_данные
FROM источник_таблица
ON DUPLICATE KEY UPDATE данные = VALUES(данные);

Теперь вам не придется беспокоиться о сохранении уникальности данных. В случае возможности дублирования, данный скрипт обновит поля данных в целевая_таблица, обеспечивая сохранность и целостность базы данных.

Обработка больших объемов передачи данных, как делают профессионалы

Работа с большими массивами данных зачастую становится испытанием для серверов. Для эффективного массового внесения данных необходимо:

  • Объединять множественные операции в атомарные транзакции.
  • Во время вставки временно отключить индексы в целевая_таблица.
  • Для импорта данных из файлов используйте LOAD DATA INFILE.

Визуализация

Представим, что вы находитесь на фруктовом рынке (🍇🍈🍉) и выбираете фрукты для коробок:

Markdown
Скопировать код
Ваш выбор: 🍎🍐🍊 (яблоки, груши, апельсины)
Вы укладываете их в коробку: 📦

Сочетание INSERT INTO...VALUES и SELECT:

SQL
Скопировать код
INSERT INTO коробка 📦 VALUES (SELECT 🍎, 🍐, 🍊 FROM рынок);

Теперь в коробке 📦 находятся выбранные вами фрукты 🍎🍐🍊.

Для работы с большими партиями или особыми выборками используйте подзапрос и условие WHERE:

SQL
Скопировать код
INSERT INTO коробка (тип_фруктов, количество)
SELECT фрукт, COUNT(*)
FROM рынок
WHERE фрукт IN ('🍎', '🍐', '🍊')
GROUP BY фрукт;

Таким образом, вы не только выбираете определенные фрукты, но и подсчитываете их количество. Этот метод делает ваши действия гораздо эффективнее. 💪

Чего избегать: Распространённые ошибки при добавлении данных

Следует учитывать следующие нюансы, которые позволят улучшить вашу работу:

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

Полезные материалы

  1. MySQL :: Руководство по MySQL 8.0 :: 13.2.7.1 INSERT ... SELECT Statement – официальная документация MySQL на тему INSERT ... SELECT.
  2. SQLite UPSERT / UPDATE OR INSERT – Stack Overflow – обсуждение в сообществе подходов SQLite к сочетанию INSERT и SELECT.
  3. sql – Insert into ... values ( SELECT ... FROM ... ) – Stack Overflowдиалог на Stack Overflow о комбинировании INSERT INTO с SELECT.
  4. SQL INSERT INTO SELECT Statement – GeeksforGeeks – детальное руководство по использованию SQL INSERT INTO SELECT с примерами.