Dans MySQL, comment copier le contenu d'une table dans une autre table au sein de la même base de données?

118

Je suis nouveau sur MySQL. Je souhaite copier le contenu d'une table dans une autre table de la même base de données. Fondamentalement, je voudrais insérer dans une table à partir d'une autre table. Y a-t-il un moyen facile de faire cela?

Joneph O.
la source

Réponses:

184

INSERT INTO TARGET_TABLE SELECT * FROM SOURCE_TABLE;

EDIT: ou si les tables ont des structures différentes, vous pouvez également:

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

EDIT: pour contraindre cela.

INSERT INTO TARGET_TABLE (`col1_`,`col2_`) SELECT `col1`,`col2` FROM SOURCE_TABLE WHERE `foo`=1
Ggiroux
la source
Que se passe-t-il si quelqu'un souhaite effectuer des opérations d'insertion dans la table source lors de l'exécution de cette requête? il verrouille l'opération d'insertion ou non?
Lawakush Kurmi
135

Si la table n'existe pas, vous pouvez en créer une avec le même schéma comme ceci:

CREATE TABLE table2 LIKE table1;

Ensuite, pour copier les données sur:

INSERT INTO table2 SELECT * FROM table1
GSto
la source
1
J'ai trouvé ce code SELECT * INTO newTable FROM sourceTabledans w3school , pourquoi il ne fonctionne pas dansMySQL
Kasun Siyambalapitiya
@KasunSiyambalapitiya SELECT ... INTOest destiné à exporter une table vers un fichier de sortie, ou vers des variables; pas directement dans une table. Voir dev.mysql.com/doc/refman/5.7/en/select-into.html
Doktor J
@Kasun Siyambalapitiya que la page w3school est pour un SQL différent, pas pour MySQL. w3schools a maintenant des rapports d'erreurs, si vous trouvez des problèmes, signalez-les sur leur site pour aider avec des connaissances précises.
Nightwolf du
27

Si table1 est volumineuse et que vous ne souhaitez pas la verrouiller pendant la durée du processus de copie, vous pouvez effectuer un vidage et chargement à la place:

CREATE TABLE table2 LIKE table1;

SELECT * INTO OUTFILE '/tmp/table1.txt' FROM table1;
LOAD DATA INFILE '/tmp/table1.txt' INTO TABLE table2;
Ike Walker
la source
J'ai essayé de dumping sur un RDS, en utilisant la solution stackoverflow.com/a/9536680/351903 . Le fichier a été créé mais il est resté de taille 0 pendant longtemps. De plus, lors de la vérification show processlist, je ne pouvais voir aucune requête en cours d'exécution. Je ne sais pas quel est le problème.
Sandeepan Nath le
15

Cela a fonctionné pour moi,

CREATE TABLE newtable LIKE oldtable;

Réplique la nouvelle table avec l'ancienne table

INSERT newtable SELECT * FROM oldtable;

Copie toutes les données de ligne dans une nouvelle table.

Je vous remercie

Jason
la source
10

Si vous souhaitez créer et copier le contenu en un seul coup, utilisez simplement le SELECT:

CREATE TABLE new_tbl SELECT * FROM orig_tbl;

Frank Heikens
la source
4
+1 - bien que la nouvelle table n'ait pas les définitions d'index de la première. L'approche "créer ... comme ..." copiera également les définitions d'index.
Martin
2

Cela a fonctionné pour moi. Vous pouvez rendre l'instruction SELECT plus complexe, avec les clauses WHERE et LIMIT.

Commencez par dupliquer votre grande table (sans les données), exécutez la requête suivante, puis tronquez la table plus grande.

INSERT INTO table_small (SELECT * FROM table_large WHERE column = 'value' LIMIT 100)

Super simple. :-)

Sandor Fekete
la source
0
CREATE TABLE target_table SELECT * FROM source_table;

Il crée simplement une nouvelle table avec la même structure que celle de la table source et copie également toutes les lignes de source_table dans target_table.

CREATE TABLE target_table SELECT * FROM source_table WHERE condition;

Si vous avez besoin de copier certaines lignes dans target_table, appliquez une condition à l'intérieur de la clause where

CelinVeronicca
la source
-3

Essaye ça. Fonctionne bien dans mon Oracle 10g,

CREATE TABLE new_table
  AS (SELECT * FROM old_table);
RAHUL KUMAR
la source
8
Mais la question concerne MySQL.
Salman A
Cela a donné + pour cela, car cela fonctionne aussi avec MySQL. dev.mysql.com/doc/refman/5.7/en/create-table-select.html
Daniel