Совмещаем MySQL INSERT INTO, VALUES и SELECT в одном запросе
Быстрый ответ
Для внесения данных с помощью запроса SELECT используется конструкция INSERT INTO целевая_таблица
(колонки) SELECT значения
FROM источник_таблица
WHERE условия
. Вот пример кода:
INSERT INTO целевая_таблица (кол1, кол2)
SELECT кол1, кол2
FROM источник_таблица
WHERE фильтр_условие;
Такой запрос передает данные из колонок кол1
и кол2
из источник_таблица
в целевая_таблица
по заданному фильтр_условие
.
Комбинирование статических данных с результатом SELECT
В некоторых ситуациях требуется сочетать предопределенные статичные данные с результатами, получаемыми c помощью SELECT, при их внесении в таблицу. Пример этого процесса:
INSERT INTO целевая_таблица (кол1, кол2, кол3)
SELECT кол1, кол2, 'статичное_значение'
FROM источник_таблица
WHERE определенное_условие;
В данном случае кол3
последовательно получает статичное значение 'статичное_значение'
при каждой вставке строки, что дает возможность комбинирования статических и динамических данных.
Устранение проблемы дубликатов при вставке
Появление дубликатов может серьезно нарушить целостность данных. Чтобы не допустить добавление повторяющихся данных, можно использовать INSERT IGNORE. С другой стороны, если необходимо обновить уже существующие записи, применяйте ON DUPLICATE KEY UPDATE.
INSERT INTO целевая_таблица (id, данные)
SELECT источник_id, источник_данные
FROM источник_таблица
ON DUPLICATE KEY UPDATE данные = VALUES(данные);
Теперь вам не придется беспокоиться о сохранении уникальности данных. В случае возможности дублирования, данный скрипт обновит поля данных
в целевая_таблица
, обеспечивая сохранность и целостность базы данных.
Обработка больших объемов передачи данных, как делают профессионалы
Работа с большими массивами данных зачастую становится испытанием для серверов. Для эффективного массового внесения данных необходимо:
- Объединять множественные операции в атомарные транзакции.
- Во время вставки временно отключить индексы в
целевая_таблица
. - Для импорта данных из файлов используйте LOAD DATA INFILE.
Визуализация
Представим, что вы находитесь на фруктовом рынке (🍇🍈🍉) и выбираете фрукты для коробок:
Ваш выбор: 🍎🍐🍊 (яблоки, груши, апельсины)
Вы укладываете их в коробку: 📦
Сочетание INSERT INTO...VALUES и SELECT:
INSERT INTO коробка 📦 VALUES (SELECT 🍎, 🍐, 🍊 FROM рынок);
Теперь в коробке 📦 находятся выбранные вами фрукты 🍎🍐🍊.
Для работы с большими партиями или особыми выборками используйте подзапрос
и условие WHERE
:
INSERT INTO коробка (тип_фруктов, количество)
SELECT фрукт, COUNT(*)
FROM рынок
WHERE фрукт IN ('🍎', '🍐', '🍊')
GROUP BY фрукт;
Таким образом, вы не только выбираете определенные фрукты, но и подсчитываете их количество. Этот метод делает ваши действия гораздо эффективнее. 💪
Чего избегать: Распространённые ошибки при добавлении данных
Следует учитывать следующие нюансы, которые позволят улучшить вашу работу:
- Проверьте совместимость типов данных между внесенными и целевыми колонками.
- Запомните, что блокировки базы данных вполне могут возникать в процессе транзакций и повлиять на параллельные процессы.
- Будьте внимательны при использовании подзапросов: они могут замедлить процесс вставки, если не проиндексированы или слишком сложны.
Полезные материалы
- MySQL :: Руководство по MySQL 8.0 :: 13.2.7.1 INSERT ... SELECT Statement – официальная документация MySQL на тему INSERT ... SELECT.
- SQLite UPSERT / UPDATE OR INSERT – Stack Overflow – обсуждение в сообществе подходов SQLite к сочетанию INSERT и SELECT.
- sql – Insert into ... values ( SELECT ... FROM ... ) – Stack Overflow – диалог на Stack Overflow о комбинировании INSERT INTO с SELECT.
- SQL INSERT INTO SELECT Statement – GeeksforGeeks – детальное руководство по использованию SQL INSERT INTO SELECT с примерами.