Voici une petite astuce pour cloner une table (My)SQL en effectuant une copie de la table à l'identique. Index, types et données, tout est préservé.
Rien de sorcier, juste un peu de logique.
Premièrement on crée la nouvelle table (table_clonee) à partir de la table_source :
CREATE TABLE table_clonee LIKE table_source ;
Puis nous insérons les données dans la nouvelle table en "lisant" celles de la table_source
INSERT INTO table_clonee SELECT * FROM table_source ;
Simple et efficace.
Note : cela doit fonctionner également sur d'autres moteurs de bases de données, moyennant quelques adaptations syntaxiques
Auteur : Mr Xhark
Fondateur du blog et passionné par les nouvelles techno, suivez-moi sur twitter
24 commentaires
Attention il y a une limite à ça !! Pour les tables contenant des clés étrangères, celles-ci ne sont pas copiées. Il faut donc faire attention à recréer les contraintes sur la nouvelle table si on veut qu'elle se comporte de la même manière que l'ancienne !!
Sinon c'est très utile lorsqu'on met à jour des données régulièrement et que la mise à jour prends du temps. On insère ainsi les données dans la nouvelle table et on renomme ensuite les tables de cette façon :
RENAME table_source AS table_source_before, table_clonee AS table_source;
Plus qu'à supprimer la table table_source_before et le tour est joué !!
@Nico : dans le cas où ta table comporte des clés il est fortement conseillé de faire un export de la structure l'ancienne table puis de créer une nouvelle table dans laquelle tu injecteras les données.
Personnellement je me sers de ce genre de manip pour archiver des données. Cela me permet de purger les tables principales et de garder une trace des données dans des tables d'archives.
Mais ta remarque est tout à fait pertinente.
Très bien,
mais ça créé avec le moteur de base de données par défaut (généralement MyISAM),
si vous copiez une base INNODB,
ça en fait une copie sous MyISAM
(et réciproquement)...
Donc astuce intéressante, mais attention au moteur par défaut !
@marcelus : de mon côté lorsque je copie une table le type est préservé, et cela me paraît tout à fait logique vu que le type est dans la structure (qui est copiée).
Peut-être cela dépend des configurations ? as-tu essayé chez toi ?
Autant pour moi (tu peux enlever mon post)
j'avais mal lu (et répondu de mémoire) dans
"Audit et optimisation de MySQL 5 -
bonnes pratiques pour l'administrateur"
(page 55)
C'est l'instruction :
CREATE TABLE table_clonee SELECT * FROM table_source ;
qui ne copie pas les index ni le moteur...
(Donc, très bonne ton astuce !)
J'avais commencé à faire un script PHP mais c'est bcp plus simple directement sur le SGBD.
Merci bcp !
Bonjour,
J'ai utilisé cette méthode mais il n'y a pas eu de copie des indexes.
Sous mySql Browser, je passe par 'Copy Create Statement to clipboard'. *Attention*, il faut supprimer le drop inclus par défaut et renommer le fichier avant d'exécuter l'ordre mySQL obtenu.
bonjour
merci pour ce post! je voulais savoir comment faire pour copier automatiquement (par exemple toutes les 5 minutes) une table A vers une table B de même structure...
cordialement
christophe
@tutuxe
Si c'est sur 2 serveurs différents, tu peux configurer en maître/esclave et tu as ta synchro quasi instantanément.
merci pour ta réponse !! j'ai une seule bdd avec mes tables... je suis sur un seul et même serveur... je suis allé voir sur phpmyadmin ce qui était possible mais j'avoue complètement sécher...
Si tu ne veux pas copier 100k fois les mêmes enregistrement, il faudra que tu mettes un témoin de copie dans le fichier d'origine qui est mis à 1 quand l'enregistrement est copié et à 0 s'il est modifié.
@tutuxe: via PHP + CRON. Mais quel est ton besoin? car la solution ne semble pas des meilleures!
Il doit y avoir un quiproquo, je croyais qu'on parlait de ton besoin : pour copier automatiquement (par exemple toutes les 5 minutes) une table A vers une table B
bonjour
merci pour les reponses 🙂
mon besoin est le suivant : j'utilise joomla avec le composant fabrik.
Je souhaite afficher une même table de deux manières différentes sur la même page, or ceci est impossible car fabrik attribue le même ID pour les deux affichages. Il n'y a donc qu'un seul template possible, lié à un seul ID.
La solution est creer une table B jumelle de la première A. Ainsi, les deux tables auront un ID différent mais avec un contenu identique... l'astuce serait donc que chaque nouvelle entrée sur la table A s'enregistre également sur la table B... les données apparaitrons simultanément sur les deux différents endroits avec deux différents templates...
je ne sais pas si je suis assez clair dans mes explications....
bien cordialement
tutuxe
Je ne connais pas ces 2 outils mais une vue ne serait-elle pas la solution ?
@tutuxe: Je confirme ce que te dis Brice, fais une vue si tu ne touches pas à la table identiques. Sinon, passer par un déclencheur MySQL
Et finalement, comment faire pour copier une table avec les index, et les intégrités référentielles ?
@Eclipse: tu peux exporter la structure des tables avec PHPMyAdmin, renommer les tables dans les instructions MySQL et ré-importer (attention à l'ordre si tu as des contraintes)
Bonjour,
la question c'est de pouvoir copier une table A vers une table B (peu importe le serveur et la base) en maintenant les index et sous PHP.
CREATE TABLE A AS SELECT * FROM B
copie la table mais ignore les indexs
* et pas sous phpmyadmin, ça c'est faisable.
et vu que le besoin est sous PHP, il faut je pense faire une function
qui récupère la structure pour faire le create, les indexs, et le contenu (si besoin)
Merci qui qquns a deja fait cela...
@srdev: si tu veux copier les index il faut procéder comme suit :
@Mr Xhark:
Ben voila, c'est tout simple un create LIKE et ça marche les indexs suivent bien
merci beaucoup pour le coup de main.
@SRDEV: merci pour ton retour, cela servira peut-être à d'autres 🙂
Mais, si je copie les données des tables avec phpmyadmin, je dois cocher quelque chose de particulier ?
En temps normal, j'exporte ma base mysql, avec les options par défaut de phpmyadmin.
Du coup, c'est bon pour conserver les index , les intégrités, les relations, et tout le tintouin ?
@Eclipse: Tu peux exporter la structure (sans les données) et tu verras qu'à la fin il y a des "add constraint", etc.
PMA est capable de préserver la structure. C'est au moment de l'import où tu peux avoir des erreurs suivant l'ordre dans lequel les tables sont créés. Ex : si tu crées la table fille rattachée à une table mère par une clé étrangère qui n'a pas encore été créée, tu auras une erreur explicite à ce sujet