Как в MySQL скопировать содержимое одной таблицы в другую в той же базе данных?

118

Я новичок в MySQL. Я хотел бы скопировать содержимое одной таблицы в другую в той же базе данных. В принципе, я хотел бы вставить в таблицу из другой таблицы. Есть простой способ сделать это?

Джонеф О.
источник

Ответы:

184

INSERT INTO TARGET_TABLE SELECT * FROM SOURCE_TABLE;

РЕДАКТИРОВАТЬ: или, если таблицы имеют разные структуры, вы также можете:

INSERT INTO TARGET_TABLE (`col1`,`col2`) SELECT `col1`,`col2` FROM SOURCE_TABLE;

РЕДАКТИРОВАТЬ: чтобы ограничить это ..

INSERT INTO TARGET_TABLE (`col1_`,`col2_`) SELECT `col1`,`col2` FROM SOURCE_TABLE WHERE `foo`=1
ggiroux
источник
Что произойдет, если кто-то захочет выполнить операции вставки в исходную таблицу во время выполнения этого запроса? он блокирует операцию вставки или нет?
Лавакуш Курми
135

Если таблица не существует, вы можете создать ее с такой же схемой, например:

CREATE TABLE table2 LIKE table1;

Затем, чтобы скопировать данные:

INSERT INTO table2 SELECT * FROM table1
GSto
источник
1
Я нашел этот код SELECT * INTO newTable FROM sourceTableв w3school , почему он не работаетMySQL
Касун Сиямбалапития
@KasunSiyambalapitiya SELECT ... INTOпредназначена для экспорта таблицы в выходной файл или в переменные; не прямо в стол. См. Dev.mysql.com/doc/refman/5.7/en/select-into.html
Doktor J
@Kasun Siyambalapitiya, эта страница w3school предназначена для другого SQL, не предназначенного для MySQL. В w3schools теперь есть отчеты об ошибках, если вы обнаружите проблемы, сообщите об этом на их сайте, чтобы получить точные знания.
Nightwolf
27

Если table1 большой, и вы не хотите блокировать его на время процесса копирования, вы можете вместо этого выполнить dump-and-load:

CREATE TABLE table2 LIKE table1;

SELECT * INTO OUTFILE '/tmp/table1.txt' FROM table1;
LOAD DATA INFILE '/tmp/table1.txt' INTO TABLE table2;
Айк Уокер
источник
Я попытался сбросить данные на RDS, используя решение stackoverflow.com/a/9536680/351903 . Файл был создан, но долгое время оставался нулевым. Кроме того, при проверке show processlistя не увидел запущенных запросов. Не уверен, в чем проблема.
Сандипан Натх,
15

Это сработало для меня,

CREATE TABLE newtable LIKE oldtable;

Копирует новую таблицу со старой таблицей

INSERT newtable SELECT * FROM oldtable;

Копирует все данные строки в новую таблицу.

Спасибо

Джейсон
источник
10

Если вы хотите создать и скопировать контент за один раз, просто используйте SELECT:

СОЗДАТЬ ТАБЛИЦУ new_tbl SELECT * FROM orig_tbl;

Фрэнк Хайкенс
источник
4
+1 - хотя в новой таблице не будет определений индекса из первого. Подход «создать ... как ...» также скопирует определения индекса.
Мартин
2

Это сработало для меня. Вы можете сделать оператор SELECT более сложным с помощью предложений WHERE и LIMIT.

Сначала продублируйте большую таблицу (без данных), выполните следующий запрос, а затем обрежьте большую таблицу.

INSERT INTO table_small (SELECT * FROM table_large WHERE column = 'value' LIMIT 100)

Очень просто. :-)

Шандор Фекете
источник
0
CREATE TABLE target_table SELECT * FROM source_table;

Он просто создает новую таблицу с той же структурой, что и исходная таблица, а также копирует все строки из source_table в target_table.

CREATE TABLE target_table SELECT * FROM source_table WHERE condition;

Если вам нужно скопировать несколько строк в target_table, примените условие внутри предложения where

CelinVeronicca
источник
-3

Попробуй это. Хорошо работает в моем Oracle 10g,

CREATE TABLE new_table
  AS (SELECT * FROM old_table);
РАХУЛ КУМАР
источник
8
Но вопрос в MySQL.
Salman A
За это он дал +, потому что он тоже работает с MySQL. dev.mysql.com/doc/refman/5.7/en/create-table-select.html
Daniel