2009-09-10 8 views
5

Mon entreprise déplace actuellement nos bases de données, en déplaçant un ensemble de tables de l'ancienne instance MySQL vers la nouvelle. Nous avons effectué un certain développement avant cette migration, et la structure de certaines tables a été modifiée par rapport à l'original (par exemple, les colonnes ont été supprimées).Migration de MySQL vers une table avec une structure différente

Donc actuellement j'ai jeté les données de l'ancienne base de données et essaye maintenant de les réinsérer dans la nouvelle table. Bien sûr, l'importation borks quand il essaie d'insérer des lignes avec plus de champs que la table a.

Quel est le meilleur moyen (de préférence scriptable, car je prévois d'avoir à le faire quelques fois de plus) pour importer uniquement les champs dont j'ai besoin dans la nouvelle table?

Répondre

2

Mise à jour les éléments suivants en fonction:

SELECT 'INSERT INTO NEW_TABLE ... ('+ to.column +');' 
    FROM OLD_TABLE ot 

Vous avez besoin d'une instruction INSERT pour la table sur la nouvelle base de données, avec la liste des colonnes. Puis remplissez la partie de valeur en fonction des valeurs de l'ancienne table. Exécuter dans l'ancien environnement, et vous aurez vos insertions avec des données pour le nouvel environnement - copiez-le simplement dans un script. Remarquez que les types de données doivent être manipulés en conséquence - les dates (y compris le temps), et les chaînes devront être traitées parce que vous avez affaire à du texte.

0

Si vous utilisez MySQL 5.1, une solution puissante, bien que peut-être dans ce cas-la, soit de faire un mysqldump xml et d'utiliser un XSLT pour le transformer. Malheureusement, la réimportation de ce fichier xml n'est pas prise en charge dans 5.0, vous aurez besoin de 5.1, 5.4 ou 6.0

2

Tout d'abord, créez une nouvelle base de données avec une ancienne structure ou des tables temporaires dans la base de données actuelle. Ensuite, exécutez le script avec des instructions d'insertion pour chaque ligne, mais dans les valeurs, il ne faut que les champs qui sont dans la nouvelle structure.

insert into newTable select row1,row2 from tempTable 
1

Utilisez la manière la plus rapide, les données INFILE:

- données Dump

SELECT * INTO OUTFILE 'mybigtable.csv' 
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' 
    LINES TERMINATED BY '\n' 
    FROM mybigtable 

- Données de charge

LOAD DATA LOCAL INFILE 'mybigtable.csv' 
    INTO TABLE mynewbigtable 
    FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' 
    (@col1,@col2,@col3,@col4) set [email protected],[email protected]; 

Ref:

http://dev.mysql.com/doc/refman/5.6/en/insert-speed.html

http://dev.mysql.com/doc/refman/5.6/en/load-data.html

Questions connexes