Копирование данных из одной таблицы в другую в MySQL
Быстрый ответ
Если вам необходимо быстро клонировать все данные из таблицы existing_table
в таблицу new_table
при условии, что их структуры совпадают, можно использовать оператор INSERT INTO...SELECT:
-- Клонируем данные!
INSERT INTO new_table
SELECT * FROM existing_table;
Если структура таблицы new_table
отличается, потребуется указать конкретные колонки и соответствующие им данные:
-- Указываем колонки!
INSERT INTO new_table(column1, column2)
SELECT column1, column2 FROM existing_table;
Работа с различными данными
Выборочное копирование данных – использование условия WHERE
Для копирования определенных строк используйте условие WHERE
:
-- Копируем только нужные данные!
INSERT INTO new_table
SELECT * FROM existing_table
WHERE condition;
Точное клонирование структуры – CREATE TABLE LIKE
Если нужно создать точный копию структуры таблицы без переноса данных:
-- Создаем копию структуры!
CREATE TABLE new_table LIKE existing_table;
Копирование структуры и данных одновременно
Скопировать структуру и данные одновременно можно, выполнив следующий запрос:
-- Эффективное клонирование!
CREATE TABLE new_table
SELECT * FROM existing_table;
Сложные структуры таблиц? Решение есть!
Соответствие колонок
При различающихся структурах таблиц следует соотнести названия колонок, чтобы данные правильно перенеслись:
-- Копирование с учетом соответствия колонок!
INSERT INTO new_table(dest_col1, dest_col2)
SELECT source_col1, source_col2 FROM existing_table;
Учет целостности и оптимизация данных
При работе с данными всегда учитывайте внешние ключи, индексы и ограничения для поддержания целостности данных.
Визуализация
Для наглядного примера представим перенос автомобилей из одного гаража в другой:
🏠 (Исходный Гараж): [🚗, 🚕, 🚙, 🚌]
🏡 (Целевой Гараж): [ ]
Перемещаем все автомобили из исходного гаража (🏠) в целевой (🏡):
-- Все машины переехали в новый гараж!
INSERT INTO 🏡 (Целевой Гараж)
SELECT * FROM 🏠 (Исходный Гараж);
После выполнения запроса получаем:
🏡 (Теперь Целевой Гараж): [🚗, 🚕, 🚙, 🚌]
Рекомендации для продвинутых пользователей
Трансформация данных в процессе копирования
Вы можете использовать SQL-функции, чтобы изменять данные в процессе копирования:
-- Преобразуем данные на лету!
INSERT INTO new_table
SELECT CONCAT(first_name, ' ', last_name) as full_name FROM existing_table;
Работа с большими объемами данных
При передаче больших объемов данных рекомендуется использовать разбивку на части (chunking), пакетные вставки или временные таблицы.
Обращение со столбцами с автоинкрементом
Будьте особенно внимательны при работе со столбцами, имеющими автоинкремент, чтобы избежать конфликтов при переносе.
Полезные материалы
- MySQL :: MySQL 8.0 Справочное Руководство :: 13.1.20.4 CREATE TABLE ... SELECT Statement
- sqlite – Как просто и быстро мигрировать из SQLite3 в MySQL? – Stack Overflow
- Клонирование таблиц в MySQL – Database Journal
- TechOnTheNet – Объяснение команды INSERT INTO SELECT
- SQL Server – Копирование таблицы из одной базы данных в другую – SQL Authority