Як скопіювати вміст однієї таблиці в іншу таблицю в одній базі даних в MySQL?


118

Я новачок у MySQL. Я хотів би скопіювати вміст однієї таблиці в іншу таблицю в межах однієї бази даних. В основному, я хотів би вставити до таблиці з іншої таблиці. Чи є простий спосіб зробити це?

Відповіді:


184

INSERT INTO TARGET_TABLE SELECT * FROM SOURCE_TABLE;

EDIT: або якщо таблиці мають різні структури, ви також можете:

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

EDIT: щоб обмежити це ..

INSERT INTO TARGET_TABLE (`col1_`,`col2_`) SELECT `col1`,`col2` FROM SOURCE_TABLE WHERE `foo`=1

Що буде, якщо хтось захоче виконати операції з вставкою у вихідній таблиці під час виконання цього запиту? це заблоковано операцію вставки чи ні?
Lawakush Kurmi

135

Якщо таблиці не існує, ви можете створити її з такою ж схемою, як:

CREATE TABLE table2 LIKE table1;

Потім скопіюйте дані на:

INSERT INTO table2 SELECT * FROM table1

1
Я знайшов цей код SELECT * INTO newTable FROM sourceTableу w3school , чому він не працюєMySQL
Kasun Siyambalapitiya

@KasunSiyambalapitiya SELECT ... INTOпризначений для експорту таблиці у вихідний файл або до змінних; не безпосередньо в стіл. Дивіться dev.mysql.com/doc/refman/5.7/uk/select-into.html
Doktor J

@Kasun Siyambalapitiya, що сторінка w3school призначена для іншого SQL, не призначена для MySQL. Тепер у w3schools є повідомлення про помилки, якщо ви виявите проблеми, повідомте про це на своєму сайті, щоб допомогти з точними знаннями.
Нічний вовк

27

Якщо table1 є великим і ви не хочете його блокувати протягом тривалості процесу копіювання, ви можете зробити дамп-і-завантаження замість цього:

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 . Файл створено, але він тривалий час залишався розміром 0. Також під час перевірки show processlistя не міг бачити жоден запит, що працює. Не впевнений, у чому проблема.
Сандепіан Нат

15

Це працювало для мене,

CREATE TABLE newtable LIKE oldtable;

Повторює новинку зі старою таблицею

INSERT newtable SELECT * FROM oldtable;

Копіює всі дані рядків у нову таблицю.

Дякую


10

Якщо ви хочете створити та скопіювати вміст в одному кадрі, просто використовуйте ВИБІР:

СТВОРИТИ ТАБЛИКУ 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, то застосуйте умову всередині, де пункт


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.