Добавление записей MySQL из одной таблицы в другую

Из архива блога, 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.

Роман Кузнецов · Mobecan