web-dev-qa-db-fra.com

Le moyen le plus rapide de copier une table dans mysql?

Je veux copier une table dans MySQL. Quel est le moyen le plus rapide? Comme ça?

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

ou

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

ou y a-t-il un autre moyen?

EDIT: Je crains que les index ne soient recréés, comment mysql procède-t-il pour exécuter ces instructions?

PS ne peut pas utiliser d'outils de ligne de commande comme mysqldump, doit être à la volée.

81
Anon

Ceci copie immédiatement la structure de la table, mais pas les données:

CREATE TABLE copy LIKE original;

Cela crée tous les index de la table original.

Cela fonctionne de cette façon dans mysql 5.1.39.

48
ceteras

Le moyen le plus rapide d'utiliser MyISAM tables tandis que préservent les index et peut-être d'autres moteurs de stockage est le suivant:

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

Vous souhaitez désactiver vos clés pour le chargement de votre base de données, puis les recréer à la fin.

De même, pour InnoDB:

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

(Comme indiqué dans les commentaires.)

43
ctbrown

Du manuel :

"CREATE TABLE ... SELECT ne crée pas automatiquement d'index pour vous. Ceci est fait intentionnellement pour rendre l'instruction aussi flexible que possible. Si vous souhaitez avoir des index dans la table créée, vous devez les spécifier avant l'instruction SELECT:"

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

Vous pouvez spécifier des index et des types de données (pour éviter la conversion de types de données) avec CREATE TABLE LIKE Et CREATE TABLE SELECT. Lequel est le plus rapide dépend de votre configuration.

13
dnagirl

Pour copier avec des index et des déclencheurs, effectuez ces 2 requêtes:

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

Pour copier uniquement la structure et les données, utilisez celui-ci:

CREATE TABLE tbl_new AS SELECT * FROM tbl_old;
8
Zigri2612

Est-ce que create table mynewtable (select * from myoldtable) fonctionne dans mysql? Si oui, vous pouvez l'essayer aussi.

6
Draco Ater

Le meilleur moyen de copier la structure et toutes les entrées d'une table à une autre (en créant une nouvelle table) est cette requête ...

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

5
Anil Chahal

Essayez SELECT INTO , et utilisez un variable comme intermédiaire.

Vous devez d'abord créer la table de réception pour avoir la même structure que la table source.

Le mieux, c’est interne, donc rapide. Vous allez perdre vos index, cependant.

3
amphetamachine

si vous utilisez MyISAM, vous pouvez également copier et renommer les fichiers individuels. Fichiers .MYD, .MYI, .FRM dans le backend

2
Aravind

Peut-être que vous pourriez jeter un oeil à SHOW CREATE TABLE.

Étapes à suivre:

  • Aller à phpmyadmin

  • Aller à SQL

Exécuter cette requête

SHOW CREATE TABLE `the_old_table`;
  • Cliquez sur options Cochez "Textes complets" et appuyez sur OK.

Le résultat est une instruction CREATE TABLE complète. Modifiez la requête jusqu'à ce que vous soyez satisfait.

Ressource: http://dev.mysql.com/doc/refman/5.7/en/show-create-table.html

1
Julian
CREATE TABLE copy SELECT * FROM original;

C'est un moyen rapide mais peut-être pas la cause la plus rapide d'index.

0
Thor