MySQL — как вставить данные из одной таблицы в другую?

Скопировать данные из одной таблицы в другую в базе данных MySQL полностью или частично очень просто. Далее рассмотрим несколько вариантов копирования данных.
Итак, чтобы полностью скопировать данные из одной таблицы в другую достаточно такого запроса:
INSERT INTO table_to
SELECT * FROM table_from
Вместо table_to и table_from подставляете названия своих таблиц и все получится.
Скопировать только некоторые столбцы из одной таблицы в другую можно таким запросом:
INSERT INTO table_to (`col1`, `col2`, `col2`)
SELECT `a1`, `a2`, `a3` FROM table_from
И последний вариант, копирование данных из таблицы в таблицу по какому-либо условию:
INSERT INTO table_to (`col1`, `col2`, `col2`)
SELECT `a1`, `a2`, `a3` FROM table_from WHERE `a1` > 100;
Выполнить данные запросы можно с помощью phpAdmin или любого другого mysql-менеджера. На этом все, до новых встреч!
Копирование записей из одной таблицы в другую MySQL
Примеры SQL-запросов для копирования записей из разных таблицы.
Частичное копирование
К примеру есть две одинаковые по структуре, нужно из таблицы `table_a` скопировать запись с определенными полями в таблицу `table_b`.
INSERT INTO `table_a` (`name`, `alt`, `page`) SELECT `name`, `alt`, `page` FROM `table_b` WHERE `id` = 1
Копирование нескольких записей:
INSERT INTO `table_a` (`name`, `alt`, `page`) SELECT `name`, `alt`, `page` FROM `table_b` WHERE `id` IN(1,2,3)
Полное копирование
Если таблицы `table_a` и `table_b` полностью одинаковые по структуре, то названия полей можно опустить.
INSERT INTO `table_b` SELECT * FROM `table_a`
Или указать только нужные поля:
INSERT INTO `table_a` (`name`, `alt`, `page`) SELECT `name`, `alt`, `page` FROM `table_b`
Подгонка структуры таблицы
Если таблицы разные по структуре, то можно подогнать названия и значения полей.
INSERT INTO `table_b` (`name`, `alt`, `page`, `module`, `sort`) SELECT `filename` AS `name`, '' AS `alt`, `page`, 'prod' AS `module`, 1 AS `sort` FROM `table_a`
Копирование с подзапросом в третью таблицу
INSERT INTO `table_b` (`name`, `alt`, `page`, `module`, `sort`) SELECT (SELECT `name` FROM `table_c` WHERE `item_id` = `table_a`.`id`) AS `name`, '' AS `alt`, `page`, 'prod' AS `module`, 1 AS `sort` FROM `table_a`
Копирование записей из двух и более таблиц
INSERT INTO `table_b` (`name`, `email`, `address`) SELECT * FROM ( (SELECT `name`, `email`, `address` FROM `table_a`) UNION ( SELECT `name`, `email`, `address` FROM `table_c`) )
Как перенести данные из одной таблицы в другую?
Добрый вечер, хочу перенести данные из одной таблицы в другую, но проблема в том, что в той таблице, в которую хочу перенести данные количество столбцов больше как можно это обойти ?
INSERT INTO orders SELECT * FROM basket
- Вопрос задан более трёх лет назад
- 2372 просмотра
Комментировать
Решения вопроса 1
alexalexes @alexalexes
Перечислите, какие столбцы вставить, и забейте недостающие данные null-ами, если допускается null-значение в колонке, если нет, то каким-нибудь значением по умолчанию.
insert into orders (column_1, column_2, column_3) select column_1, column_2, 'default_value' fake_column from basket
PS: fake_column может быть не только задано статичным значением из текста запроса, но и вычислено подзапросом (и даже хранимой или какой-нибудь функцией), возвращающим скалярное значение:
insert into orders (column_1, column_2, column_3) select column_1, column_2, (select count(*) from basket) fake_column from basket
Форум пользователей MySQL
Проблема следующая. Имеются две таблицы: в одной активные сделки, во второй архив.
Таблицы отличаются только одним полем — в архивной имеется id архивной записи.
Как можно перенести все записи из 1-й таблицы во вторую?
Набор полей table_arch
id_arch, id_act, pole1, pole2
Набор полей table_act
id_act, pole1, pole2
Уже работает следующая команда:
INSERT INTO table_arch select », pole1, pole2 from table_act
Но т.к. в реальности количество полей гораздо больше — вопрос: существует ли более короткое/красивое решение типа:
INSERT INTO table_arch select », * from table_act
(к сожалению этот вариант выдает ошибку и просит проверить синтаксис
Отредактированно TheVeter (05.02.2014 00:05:28)
#2 05.02.2014 00:09:34
vasya Архат Откуда: Орел Зарегистрирован: 07.03.2007 Сообщений: 5823
Re: Перенос данных из одной таблицы в другую с добавлением полей.
INSERT INTO table_arch (id_act, pole1, pole2) select * from table_act
Или указать только нужные поля, если вам нужно переносить не все данные
INSERT INTO table_arch (pole1, pole2) select pole1, pole2 from table_act
#3 05.02.2014 00:09:56
deadka Администратор Зарегистрирован: 14.11.2007 Сообщений: 2417
Re: Перенос данных из одной таблицы в другую с добавлением полей.
INSERT INTO table_arch ( id_act, pole1, pole2 ) select id_act, pole1, pole2 from table_act;
По идее должно отработать если поле id_arch может принимать значение NULL или имеет значение по умолчанию.
Если не получится, то приведите сюда результаты
show create table table_arch;
и
show create table table_act;
Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли.
#4 05.02.2014 00:16:06
TheVeter Участник Зарегистрирован: 04.02.2014 Сообщений: 6
Re: Перенос данных из одной таблицы в другую с добавлением полей.
Спасибо за оперативный ответ, но все предложенные варианты требует перечисления всех полей, которые нужно вставить. От чего я и пытался избавиться. Да, они работают.
Но мне интересно, можно ли уйти от перечисления всего, что нужно. В реальности в таблицах по 20-30 полей (есть шанс ошибки + обычная лень). Отличие — только на одно поле (id архивной записи). Плюс база в процессе разработки, и набор полей может измениться (одновременно в двух таблицах). Не хотелось бы при изменениях править еще и код этого запроса.
Отредактированно TheVeter (05.02.2014 00:16:56)
#5 05.02.2014 00:18:09
vasya Архат Откуда: Орел Зарегистрирован: 07.03.2007 Сообщений: 5823
Re: Перенос данных из одной таблицы в другую с добавлением полей.
TheVeter написал:
Но мне интересно, можно ли уйти от перечисления всего, что нужно.
#6 05.02.2014 00:21:10
TheVeter Участник Зарегистрирован: 04.02.2014 Сообщений: 6
Re: Перенос данных из одной таблицы в другую с добавлением полей.
На всякий случай, еще одно пояснение: поле id_arch в архивной таблице с автоинкрементом, поэтому и нужно перед всеми полями вставить ».
#7 05.02.2014 00:21:57
TheVeter Участник Зарегистрирован: 04.02.2014 Сообщений: 6
Re: Перенос данных из одной таблицы в другую с добавлением полей.
жалко, что нельзя. Спасибо.
#8 05.02.2014 00:23:15
vasya Архат Откуда: Орел Зарегистрирован: 07.03.2007 Сообщений: 5823
Re: Перенос данных из одной таблицы в другую с добавлением полей.
Не обязательно, его можно и не указывать в явном виде перечислив поля для архивной таблицы. Посмотрите внимательно на предложенные вам варианты.
#9 05.02.2014 00:24:03
deadka Администратор Зарегистрирован: 14.11.2007 Сообщений: 2417
Re: Перенос данных из одной таблицы в другую с добавлением полей.
В принципе можно схитрить, написав хранимую процедуру, в которой обратиться к таблице information_schema, выбрать там все поля нужных таблиц и «склеить» из этого нужный запрос.
Если уж так лениво писать все поля ручками.
Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли.
#10 05.02.2014 00:31:26
vasya Архат Откуда: Орел Зарегистрирован: 07.03.2007 Сообщений: 5823
Re: Перенос данных из одной таблицы в другую с добавлением полей.
Кстати, да, deadka прав.
Посмотрите http://webew.ru/articles/200.webew
#11 05.02.2014 00:31:50
TheVeter Участник Зарегистрирован: 04.02.2014 Сообщений: 6
Re: Перенос данных из одной таблицы в другую с добавлением полей.
deadka написал:
В принципе можно схитрить, написав хранимую процедуру, в которой обратиться к таблице information_schema, выбрать там все поля нужных таблиц и «склеить» из этого нужный запрос.
Если уж так лениво писать все поля ручками.
Спасибо за этот вариант. Буду копать в этом направлении. Т.к. пока у меня 2-3 таблицы с записями, которые нужно архивировать — я еще могу клепать и переклепывать запросы руками. Но если в этом направлении наметится рост — без автоматизации будет очень много ручной работы.
#12 05.02.2014 00:36:45
TheVeter Участник Зарегистрирован: 04.02.2014 Сообщений: 6
Re: Перенос данных из одной таблицы в другую с добавлением полей.
vasya написал:
Кстати, да, deadka прав.
Посмотрите http://webew.ru/articles/200.webew
Спасибо за статью, кажется то, что нужно.
Завтра на свежую голову все переварю.