Самый быстрый способ скопировать таблицу в 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

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

CREATE TABLE copy LIKE original;

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

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

Ответ 2

Самый быстрый способ использования таблиц 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;

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

Ответ 3

Из руководства :

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

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

Чтобы скопировать с помощью индексов и триггеров, выполните следующие 2 запроса:

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

Чтобы скопировать только структуру и данные, используйте следующую команду:

CREATE TABLE tbl_new AS SELECT * FROM tbl_old;

Ответ 7

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

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

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

Ответ 8

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

Ответ 9

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

Действия:

  • Перейти к phpmyadmin

  • Перейти к SQL

Выполните этот запрос

SHOW CREATE TABLE `the_old_table`;
  • Параметры кликов Проверьте "Полные тексты" и нажмите "Перейти".

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

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

Ответ 10

CREATE TABLE copy SELECT * FROM original;

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