concaténation plusieurs bases MySQL
précautions à prendre et solutions, ou pourquoi mysql est parfois benêt!
lorsqu'on concatène plusieurs bases MySQL ayant une structure similaire mais dans un ordre différent, ne surtout pas croire que la concaténation est correcte! elle ne fonctionne que si la structure ET l'ordre sont identiques, sinon il prend dans l'ordre seulement
exemple
-- lancer mysql mysql -- creer base testA create database testA; use testA; -- creer table A.a CREATE TABLE `a` ( `a` text NOT NULL, `b` text NOT NULL, `c` text NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1; -- -- Contenu de la table `a` -- INSERT INTO `a` (`a`, `b`, `c`) VALUES ('Aa', 'Bb', 'Cc'), ('Cc', 'Cb', 'Ca'), ('Bb', 'Bc', 'Ba'); -- creer base testB create database testB; use testB; -- creer table B.a -- noter structure identique mais ordre different -- -- Structure de la table `a` -- CREATE TABLE `a` ( `b` text NOT NULL, `c` text NOT NULL, `a` text NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1; -- -- Contenu de la table `a` -- INSERT INTO `a` (`b`, `c`, `a`) VALUES ('Bb', 'Bc', 'Ba'); -- Base de données: `testC` -- creer base testC create database testC; use testC; -- creer table C.a -- noter structure identique mais ordre different -- -- Structure de la table `a` -- CREATE TABLE `a` ( `c` text NOT NULL, `b` text NOT NULL, `a` text NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1; -- -- Contenu de la table `a` -- INSERT INTO `a` (`c`, `b`, `a`) VALUES ('Cc', 'Cb', 'Ca'); -------------------------
et maintenant le test
INSERT INTO `testA`.`a` SELECT * FROM `testB`.`a` ; INSERT INTO `testA`.`a` SELECT * FROM `testC`.`a` ;
- Resultat de SELECT * FROM `testA`.`a`;
a | b | c |
---|---|---|
Aa | Bb | Cc |
Cc | Cb | Ca |
Bb | Bc | Ba |
On voit (notamment) que le champs c de TestC est devenu le champs a de TestA, et que le champs b de TestB est devenue le champs a de TestA
avec le critère "SELECT *" MySQL ne prend compte que de l'ORDRE des noms des champs, pas de leur NOMS
–> prudence, écrire tous les noms des champs
le plus simple pour les récupérer, s'il y en a beaucoup: utiliser phpMyAdmin ou mysql-query-browser et faire un SELECT en choississant tous les champs, puis corriger le script du dessus comme suit
Script propre
INSERT INTO `testA`.`a` SELECT `a`, `b`, `c` FROM `testB`.`a` ; INSERT INTO `testA`.`a` SELECT `a`, `b`, `c` FROM `testC`.`a`
et maintenant le test
- Resultat de SELECT * FROM `testA`.`a`;
a | b | c |
---|---|---|
Aa | Bb | Cc |
Ca | Cb | Cc |
Ba | Bc | Bc |
korrekt!