transfert de données entre 2 bases

transfert de données entre 2 bases - SQL/NoSQL - Programmation

Marsh Posté le 17-05-2005 à 11:32:31    

Salut les gens !!!
 
Je cherche à faire un lien entre 2 bases de données sous MySQL. Le problème est que les tables correspondantes entre ces 2 bases n'ont pas la même structure. J'ai essayé de faire le lien avec un INSERT INTO BaseQuiStock.table SELECT ... FROM BaseTemp.table ... Mais vu que je suis un débutant en SQL, j'ai quelques difficultés.
Si vous avez compris quelquechose à ce que je viens de dire et que vous avez une réponse je vous remercie d'avance.
 
++

Reply

Marsh Posté le 17-05-2005 à 11:32:31   

Reply

Marsh Posté le 17-05-2005 à 11:59:10    

tu est sur la bonne voie a mon avis
prends bien ton temps pr faire ta requête sur le papier, et tu y arriveras

Reply

Marsh Posté le 17-05-2005 à 13:27:08    

Mon problème est le suivant : je veux récupèrer les noms des logiciels grâce à "select distinct name from inventory.softwares" mais dans la table test.glpi_software, il y a une clé unique et primaire que je dois aggrémenter. Je voulais faire "select (max(ID)+1) from test.glpi_software" mais ça ne fonctionne pas. Je mets des attributs bidon pour les autres champs. Une idée??
 
insert into test.glpi_software  
select (max(ID)+1) from test.glpi_software,
select distinct name from inventory.softwares,  
 '1', NULL , NULL , '-1', NULL , '-1', '-1', '21', '-1', '2', '1'


Message édité par Doomhammer le 17-05-2005 à 13:28:31
Reply

Marsh Posté le 17-05-2005 à 13:47:37    

Tu ne peux pas avoir plusieurs SELECT dans la requête. Fais d'abord une requête SELECT correcte, qui te renvoie le résultat voulu, tu rajouteras le INSERT après ;)
 
Pour l'indice, tu pourrais effectivement faire un "MAX(ID)+1". Mais si ton champ est une clé primaire sur un entier, pourquoi ne pas la déclarer en auto-incrémentée ? MySQL fera l'addition lui même si tu ne précise pas la valeur du champ (tu n'est pas obligé de définir dans le SELECT tous les champs définis dans la table sur laquelle porte l'INSERT) ou que tu mets "0".
 
Ca pourrait faire un truc dans le genre :
INSERT INTO test.glpi_software(name)
SELECT DISTINCT name FROM inventory.softwares;
 
Les champs de test.glpi_software autres que "name" prendront leur valeur par défaut (ou la valeur suivante pour une clé auto-incrémentée) :)

Reply

Marsh Posté le 17-05-2005 à 14:03:57    

merci pour l'info!!
Avec "INSERT INTO test.glpi_software(name)  
SELECT DISTINCT name FROM inventory.softwares;" ça fonctionne nickel.
Le champ ID était déjà en auto-incrémentat.  

Reply

Marsh Posté le 17-05-2005 à 14:24:36    

re pb :
 
En plus du nom du logiciel, il me faut la version. Je voulais faire la jointure comma ça :
update test.glpi_software
set test.glpi_software.version = inventory.softwares.version
where test.glpi_software.name = inventory.softwares.name
mais il me retourne que la table est inconnue.
Y a t'il moyen de l'insérer directement pendant le INSERT INTO??

Reply

Marsh Posté le 17-05-2005 à 14:31:36    

oui, tu peux toujours faire :
INSERT INTO test.glpi_software(name, version)  
SELECT DISTINCT name, version FROM inventory.softwares
 
Mais faut bien voir que le DISTINCT porte sur tous le SELECT : un logiciel ayant plusieurs versions apparaitra plusieurs fois car le couple (name,version) aura plusieurs valeurs différentes. Peut être faudra t'il quelque chose du genre :
SELECT name, MAX(version) ... GROUP BY name
pour récupérer une version par logiciel.
 
 
Sinon, je crois qu'il existe effectivement un moyen de faire une mise à jour en utilisant plusieurs tables, mais je connais plus la syntaxe [:figti]


Message édité par mrbebert le 17-05-2005 à 14:33:21
Reply

Marsh Posté le 17-05-2005 à 14:41:59    

re-merki ;)
 
INSERT INTO test.glpi_software(name, version)  
SELECT DISTINCT name, version FROM inventory.softwares  
C'est exactement ce que je recherchais. Comme ça si il y a des postes où la mise à jour d'un poste n'a pas été effectué, on peut le voir.


Message édité par Doomhammer le 17-05-2005 à 15:37:18
Reply

Marsh Posté le 18-05-2005 à 15:40:01    

J'arrive maintenant à importer les données que je veux grâce aux INSERT INTO ... SELECT... , mais maintenant je passe aux jointures entre 2 tables fraichement remplies.  
 
ex : pour lier les softs importés avec les noms des pcs inventoriés.
Ces données sont contenues dans la table inventory.software qui contient deviceID (identifiant du pc) et name et version (nom et version du soft).
Dans la base qui doit recevoir ces donées il y a 3 tables :
 
test.glpi_software ou sont recensées les logiciels composés de ID (clé primaire) et name et version (récupérer précédement).
 
test.glpi_computers ou sont recensés les postes composés de ID(clé primaire) et name (nom du pc récupérer précedement)
 
et la 3ème à remplir : test.glpi_inst_software qui donne quel logiciel est installé sur quel pc, dont la structure est la suivante : ID(clé primaire), cID(identifiant du pc) et sID (identifiant du soft).
 
Y a t'il moyen d'effectuer la jointure entre ces 2 bases pour remplir test.glpi_ins_software??


Message édité par Doomhammer le 18-05-2005 à 15:40:50
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed