Из архива блога, 2010 год. Восстановлено 22 сентября 2026 года. Исправлены пропущенные типы полей в SQL и пояснение направления копирования. Пример запускайте в отдельной учебной базе.
Хочу написать об очень полезной возможности MySQL, которая очень помогает в рефакторинге старой БД, точнее в переносе данных из старой БД в новую, имеющую другую структуру. В данном случае нам надо вставить в новую таблицу данные, которые мы выбираем из старой.
Давайте создадим для начала две таблицы:
CREATE database testdb;
USE testdb;
CREATE TABLE table1 (id int auto_increment, fname varchar(20), lname varchar(20), primary key(id));
CREATE TABLE table2 (id int auto_increment, firstname varchar(20), lastname varchar(20), age int, primary key(id));
Теперь добавим немного данных в таблицу для работы:
INSERT INTO table2 (firstname, lastname, age)
VALUES
('Ivan', 'Ivanov', 12),
('Petr', 'Petrov', 13),
('Alex', 'Kuznetsov', 39),
('Vladimir', 'Ivanov', 42);
Теперь скопируем выбранные строки из table2 в table1. Условие WHERE оставляет людей не старше 39 лет. Это один запрос INSERT … SELECT, который вставляет результат выборки, а не отдельный запрос для каждой строки.
INSERT INTO table1 (fname, lname) SELECT firstname, lastname FROM table2 WHERE age <= 39;
Результат и ограничения
В table1 попадут Ivan, Petr и Alex: три записи. Идентификаторы создаются заново через AUTO_INCREMENT. Колонки перечислены явно, их порядок соответствует SELECT. Повторный запуск добавит те же имена еще раз: этот запрос не выполняет дедупликацию. Для реальной миграции сначала проверьте SELECT и правила уникальности на копии данных.
Связанный материал: как узнать первичный ключ таблицы. Документация: MySQL INSERT … SELECT.