Как в 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

Что произойдет, если кто-то захочет выполнить операции вставки в исходную таблицу во время выполнения этого запроса? он блокирует операцию вставки или нет?
Лавакуш Курми

135

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

CREATE TABLE table2 LIKE table1;

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

INSERT INTO table2 SELECT * FROM table1

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.