Arcy Posté(e) le 4 juin 2014 Partager Posté(e) le 4 juin 2014 Bonsoir ! Voilà, je dispose actuellement de 2 bases de données (sur MySQL), avec chacune deux tables qui m'intéressent. La première (base de données) étant utilisé par un logiciel, il m'est donc plus simple de rajouter les infos dans une autre base. Le problème est le suivant : je souhaite ajouter les ID de la première table dans la seconde sans pour autant avoir des doublons : je veux donc seulement ajouter les clés qui n'existe pas dans la seconde table. Le problème est que je vois pas comment obtenir ça en requête ... J'avais pensé à un truc du genre : INSERT INTO stock ('ID') SELECT produits.ID FROM produits RIGHT JOIN stock ON produits.ID = stock.ID WHERE produits.ID <> stock.ID ORDER BY produits.ID, stock.ID Ce qui fait qu'à la première utilisation, la première colonne de la première table sera entièrement répliqué dans la seconde et, à chaque demande, uniquement les différences. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Arcy Posté(e) le 5 juin 2014 Auteur Partager Posté(e) le 5 juin 2014 Personne n'a une petite idée ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nemasix Posté(e) le 5 juin 2014 Partager Posté(e) le 5 juin 2014 Deux bases de données, je suis pas sur que tu puisses taper deux base de données simultanément en SQL non? C'est une question hein... Sinon pour ton script, j'aurais plus mis "WHERE stock.ID = NULL" vu qu'avec la liaison RIGHT JOIN, si il ne trouve pas de stock.ID identique au produit.ID, il affichera NULL dans sa colonne (mais bon ça marche quand même pour toi, vu que le produit.ID est différent du stock.ID) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Arcy Posté(e) le 5 juin 2014 Auteur Partager Posté(e) le 5 juin 2014 Alors j'ai justement travaillé sur ça tout à l'heure. On peut joindre deux bases ensemble en indiquant le nom avant la table. INSERT INTO stock ('ID') SELECT produits.ID FROM BASE1.produits RIGHT JOIN BASE2.stock ON BASE1.produits.ID = BASE2.stock.ID WHERE produits.ID <> stock.ID ORDER BY produits.ID, stock.ID J'ai peut-être trouvé un truc mais il faut que je sache si ma requête permet de rajouter que les différences. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nemasix Posté(e) le 5 juin 2014 Partager Posté(e) le 5 juin 2014 Bah déjà tu peux faire le test du juste sélect qui va t'affiche ton résultat et vérifier qu'il est bon ou pas Lien vers le commentaire Partager sur d’autres sites More sharing options...
mozzie Posté(e) le 14 juin 2014 Partager Posté(e) le 14 juin 2014 Salut, Si ton ID est une clé primaire, elle ne peut pas être dupliquée (ça lèvera une exception), donc tu peux choisir de toutes les ajouter et de catcher les exceptions. Sinon, tu peux select tous les ID de la première table, puis tous les ID de la seconde et de faire match pour savoir celle qui n'ont pas de doublon. J'ai du faire un script de merging de table, et je me souviens que c'était pas vraiment évidant :) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Arcy Posté(e) le 14 juin 2014 Auteur Partager Posté(e) le 14 juin 2014 Alors apparemment, faire un INSERT INTO (quand la clé n'est pas primaire mais juste unique) ne fait que rajouter les différences. Lien vers le commentaire Partager sur d’autres sites More sharing options...
mozzie Posté(e) le 14 juin 2014 Partager Posté(e) le 14 juin 2014 intéressant ça, je vais tester (j'ai justement quelques petits travaux à finir sur le sujet). merci pour le retour. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Arcy Posté(e) le 14 juin 2014 Auteur Partager Posté(e) le 14 juin 2014 A ce moment là : ID (table source) : non-primaire et unique ID (cible) : non-primaire et non-unique Par contre j'avais mis des champs à NULL par défaut et je fais un INSERT des clés uniquement si elles ne sont pas dans la table cible, de mémoire. EDIT : je met ma requête ici, un instant ... INSERT INTO BASE2.tableCible (ID) ( SELECT BASE1.tableSource.ID FROM BASE1.tableSource LEFT JOIN BASE2.tableCible ON BASE1.tableSource.ID = BASE2.tableCible.IDWHERE BASE2.tableCible.ID IS NULL) Lien vers le commentaire Partager sur d’autres sites More sharing options...
NonMais Posté(e) le 26 juin 2014 Partager Posté(e) le 26 juin 2014 yep suffit de mettre une unicité sur ton champ et lorsque tu feras un insert pour un enregistrement qui existe déjà, y aura une erreur mais ça mettra le reste. Tu auras des violations de contrainte qui empêcheront les doublons. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Arcy Posté(e) le 26 juin 2014 Auteur Partager Posté(e) le 26 juin 2014 J'ai complètement oublié de passer ce sujet en résolu Il se trouve qu'effectivement, seules les LIGNES manquantes sont rajoutées : si le contenu de deux lignes (donc l'ID est identique), les lignes ne sont pas mises à jour (mais ça c'est réglé pour moi). Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.