Вставка новой записи для каждого результата в MySQL
Быстрый ответ
Изучим тему массовой вставки, используя простой и изящный подход с использованием INSERT INTO ... SELECT для создания новых записей на основе результатов запроса:
INSERT INTO my_table (col1, col2)
SELECT col1, col2
FROM your_table
WHERE choosen_condition;
Обязательно учтите, что колонки исходной и целевой таблицы должны совпадать, а также выберите условие choosen_condition
в соответствии с вашими потребностями.
Дальнейшее изучение массовой вставки
Детальней рассмотрим конструкцию INSERT INTO ... SELECT и разберем несколько нюансов, позволяющих делать операцию более изощренной. Таким образом, наши действия будут не просто функциональными, но и изящными.
Соблюдение уникальности
Чтобы избежать дублей, можно использовать ключевое слово DISTINCT
, которое поможет сохранить уникальность данных.
-- Больше не будет дубликатов!
INSERT INTO my_table (customer_id, domain)
SELECT DISTINCT customer_id, 'sql-paradise.io'
FROM your_table
WHERE type = 'foo';
Вставляем только уникальные идентификаторы customer_id
с новым доменом, таким образом избегая лишних повторов.
Сохранение целостности данных
Не посягайте на исключительность первичных ключей:
-- Уникальность наше все!
INSERT INTO my_table (id, customer_id, domain)
SELECT MAX(id)+1, customer_id, 'sql-paradise.io'
FROM your_table
GROUP BY customer_id;
Группировка и выбор максимального идентификатора id
позволят избежать любых конфликтующих ситуаций с ключами.
Визуализация
Представим ситуацию, когда для каждой строки вашей таблицы вы отправляете новогодние подарочные наборы 🎁 в другую таблицу:
INSERT INTO new_year_gifts (gift_name, delivery_date)
SELECT product_name, NOW() FROM inventory WHERE is_available = 1;
С каждой отправленной посылкой в таблице new_year_gifts
появляется новая запись:
Исходная строка 🕹️ Подарочный набор 🎁
--------------- ----------------
Строка 1 🕹️ → [Набор 1 🎁, ..., Набор N 🎁]
Строка 2 🕹️ → [Набор 1 🎁, ..., Набор N 🎁]
Строка 3 🕹️ → [Набор 1 🎁, ..., Набор N 🎁]
Таким образом, каждая выбранная строка 🕹️ становится источником для серии новых записей.
Дополнительные аспекты
Для более глубокого понимания темы рассмотрим некоторые непредвиденные сценарии и как их избежать.
Не перегружайте запрос
Следите за тем, чтобы SELECT
не выбирал слишком много данных. Проверьте его работу отдельно, чтобы увидеть получаемый набор данных.
Тестирование и заметки
Покоряйте вершины SQL в тестовом окружении до того, как применять запросы в реальной работе. Важно сохранять запросы, особенно если они комплексные или имеют сложную логику.
Продвинутые SQL-тактики
Если вы настроены на решение более сложных задач, попробуйте условную вставку:
INSERT INTO my_table (id, value)
SELECT id, IF(condition, value_if_true, value_if_false)
FROM your_table;
Или займитесь работой с несколькими таблицами:
INSERT INTO my_table (column1, column2)
SELECT t1.column1, t2.column2
FROM table1 t1
JOIN table2 t2 ON t1.key = t2.key;
Применяя эти методы, вы сможете точно настроить данные под ваши требования.
Полезные материалы
- Как вставить несколько строк одним SQL-запросом? — Stack Overflow — методы массовой вставки в MySQL.
- MySQL :: Руководство по MySQL 8.0 :: 15.2.7 Оператор INSERT — официальная документация MySQL по использованию оператора INSERT.
- MySQL :: Руководство по MySQL 8.0 :: 15.2.7.1 Оператор INSERT ... SELECT — официальное руководство по использованию INSERT ... SELECT для массовой вставки записей.
- MySQL – Запрос Insert — практическое пособие с примерами запросов INSERT в MySQL.
- SQL-оператор INSERT INTO – GeeksforGeeks — подробное объяснение оператора INSERT с примерами использования.