148 votes

En MySQL, comment copier le contenu d'une table vers une autre table de la même base de données ?

Je suis novice en matière de MySQL. Je voudrais copier le contenu d'une table vers une autre table de la même base de données. En fait, je voudrais insérer dans une table à partir d'une autre table. Existe-t-il un moyen simple de le faire ?

208voto

ggiroux Points 2971

INSERT INTO TARGET_TABLE SELECT * FROM SOURCE_TABLE;

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

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

EDIT : pour contraindre ceci..

INSERT INTO TARGET_TABLE (`col1_`,`col2_`) SELECT `col1`,`col2` FROM SOURCE_TABLE WHERE `foo`=1

0 votes

Que se passera-t-il si quelqu'un veut effectuer des opérations d'insertion dans la table source pendant l'exécution de cette requête ? L'opération d'insertion sera-t-elle bloquée ou non ?

168voto

GSto Points 13106

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

CREATE TABLE table2 LIKE table1;

Ensuite, pour copier les données :

INSERT INTO table2 SELECT * FROM table1

1 votes

J'ai trouvé ce code SELECT * INTO newTable FROM sourceTable en w3school pourquoi il ne fonctionne pas dans MySQL

0 votes

@KasunSiyambalapitiya SELECT ... INTO est destiné à exporter un tableau vers un fichier de sortie, ou vers des variables ; pas directement dans un tableau. Voir dev.mysql.com/doc/refman/5.7/fr/select-into.html

0 votes

@Kasun Siyambalapitiya cette page de w3school est pour un SQL différent, non destiné à MySQL. w3schools a maintenant un rapport d'erreur, si vous trouvez des problèmes, rapportez-les sur leur site pour aider à une connaissance précise.

34voto

Ike Walker Points 21162

Si la table1 est grande et que vous ne voulez pas la verrouiller pour la durée du processus de copie, vous pouvez faire un dump-and-load à la place :

CREATE TABLE table2 LIKE table1;

SELECT * INTO OUTFILE '/tmp/table1.txt' FROM table1;
LOAD DATA INFILE '/tmp/table1.txt' INTO TABLE table2;

0 votes

J'ai essayé de faire un dumping sur un RDS, en utilisant stackoverflow.com/a/9536680/351903 solution. Le fichier a été créé mais il est resté à une taille nulle pendant un long moment. De plus, en vérifiant show processlist Je n'ai pas vu de requête en cours d'exécution. Je ne sais pas quel est le problème.

0 votes

Cela sera optimal pour les très grandes tables !

0 votes

Cette méthode est beaucoup plus lente que les autres.

22voto

Jason Points 363

Cela a marché pour moi,

CREATE TABLE newtable LIKE oldtable;

Réplique de la nouvelle table avec l'ancienne table

INSERT newtable SELECT * FROM oldtable ;

Copie toutes les données de la ligne dans le nouveau tableau.

18voto

Frank Heikens Points 29270

Si vous souhaitez créer et copier le contenu en une seule fois, il suffit d'utiliser la fonction SELECT :

CREATE TABLE new_tbl SELECT * FROM orig_tbl;

6 votes

+1 - bien que la nouvelle table n'aura pas les définitions d'index de la première. L'approche "créer ... comme ..." copiera également les définitions d'index.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X