2010-05-31 4 views
74

Я хочу скопировать таблицу в MySQL. Какой самый быстрый способ? Как это?Самый быстрый способ скопировать таблицу в mysql?

CREATE TABLE copy LIKE original; 
INSERT INTO copy SELECT * FROM original; 

или

CREATE TABLE copy SELECT * FROM original; 
ALTER TABLE copy ADD PRIMARY KEY (id); 

или есть другой способ?

EDIT: Я беспокоюсь о воссоздании индексов, как mysql продолжает выполнять эти инструкции?

PS. не могут использовать инструменты командной строки, такие как mysqldump, должны быть «на лету».

+1

Анон Вы должны выбрать ответ на этот вопрос. – ctbrown

ответ

3

Попробуйте SELECT INTO и используйте variable как промежуточный.

Вам нужно будет создать принимающую таблицу, чтобы иметь ту же структуру, что и исходная таблица.

Самое лучшее, это внутреннее, так что это быстро. Однако вы потеряете свои индексы.

+0

Выбрать в не поддерживается mySQL –

+0

@Draco Ater - Да, это так. Он просто использует переменные. – amphetamachine

+2

Можете ли вы привести пример? Потому что я думаю, что переменные будут просто удерживать последнее значение, которое было прочитано с помощью выбора, но не всех значений в таблице. Пока вы не используете курсор и не хотите копировать таблицы с несколькими строками, это решение не работает вообще. – fancyPants

6

create table mynewtable (select * from myoldtable) Работа в mysql? Если так, вы можете попробовать.

10

От manual:

«CREATE TABLE ... SELECT автоматически не создает каких-либо индексов для вас Это сделано намеренно, чтобы сделать заявление как можно более гибким Если вы хотите иметь индексы в созданной.. таблицы, вы должны указать их перед ЗЕЬЕСТ: "

CREATE TABLE bar (UNIQUE (n)) SELECT n FROM foo; 

вы можете указать индексы и тип данных (чтобы избежать преобразования типов данных) с использованием как CREATE TABLE LIKE и CREATE TABLE SELECT. Какой из них быстрее будет зависеть от вашей настройки.

45

Это копирует структуру таблицы сразу, а не данные:

CREATE TABLE copy LIKE original; 

Это создает все индексирует original таблица была.

Он работает таким образом в mysql 5.1.39.

+1

Но он не будет копировать триггеры. – ursitesion

+1

Обратите внимание, что это также не будет копировать ограничения внешних ключей. –

2

Если вы используете MyISAM, вы также можете копировать и переименовывать файлы induvidual. .MYD, .MYI, .frm файлы в интерфейсе

36

Самый быстрый способ использования MYISAM таблицы в то время как сохранить индексы) и, возможно, другие двигатели хранения является:

CREATE TABLE copy LIKE original; 
ALTER TABLE copy DISABLE KEYS; 
INSERT INTO copy SELECT * FROM original; 
ALTER TABLE copy ENABLE KEYS; 

Вы хотите запретить ключи для загрузки базы данных и затем воссоздать ключи в конце.

Аналогично, для InnoDB:

SET unique_checks=0; SET foreign_key_checks=0; 
..insert sql code here.. 
SET unique_checks=1; SET foreign_key_checks=1; 

(Как указано в комментариях.)

+1

Странно. INSERT с ключами занял 36 минут, и этот метод занял 10 + 26 минут (insert + alter). 6 индексов, 28 M записей, Win 7 x64, 8GB RAM. –

+0

ENABLE KEYS вызывают «таблицу ремонта». Проверьте свой список процессов, каким образом это произойдет. Существует два вида: 1. ремонтный стол с keycache 2. ремонтный стол сортировкой Второй, если путь постится и будет использоваться, только если myisam_max_sort_file_size достаточно большой. https://dev.mysql.com/doc/refman/5.7/ru/repair-table-speed.html – lopo

+0

'ALTER TABLE таблица DISABLE/ENABLE KEYS' не работает в InnoDB и дает ниже предупреждение' Таблица для механизма хранения для «таблицы» эта опция отсутствует ». –

0
CREATE TABLE copy SELECT * FROM original; 

Это быстрый способ, но, возможно, не самая быстрая причина индексов.

+0

Пожалуйста, отредактируйте свой ответ и отформатируйте его правильно, чтобы сделать его доступным для чтения. – Neeku

+0

Этот оператор не копирует индексы и триггеры, связанные с этой таблицей. – ursitesion

5

Лучший способ скопировать структуру и все записи из одной таблицы в другую таблицу (путем создания новой таблицы) этот запрос ...

CREATE TABLE new_table LIKE old_table; INSERT new_table SELECT * FROM old_table;

1

Может быть, вы могли бы взглянуть на SHOW CREATE TABLE.

шаги предпринять:

  • Перейти к PhpMyAdmin

  • Перейти к SQL

выполнить этот запрос

SHOW CREATE TABLE `the_old_table`; 
  • Нажмите опции Проверьте «Полные тексты» и нажмите Go.

В результате получается полный оператор CREATE TABLE. Отредактируйте запрос, пока вы не будете счастливы.

Ресурс: http://dev.mysql.com/doc/refman/5.7/en/show-create-table.html

6

Для копирования с индексами и триггерами сделать эти 2 запроса:

CREATE TABLE newtable LIKE oldtable; 
INSERT newtable SELECT * FROM oldtable; 

Для копирования только структуры и использовать данные этого один:

CREATE TABLE tbl_new AS SELECT * FROM tbl_old;