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?

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

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

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;

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


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;


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. :-)


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


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.