différente action avec INSERT/UPDATE

Xanax_Now
Invité n'ayant pas de compte PHPfrance

27 avr. 2006, 11:23

Bonjour, dans le cadre d'un projet de stage je dois copier :

un champ d'une table d'une base
dans :
un autre champ d'une autre table d'une autre base

Petit exemple tres simple :
Dans ma base 'BDD_OLD', dans la table 'TABLE_OLD', je veux copier le champ 'CHAMP_OLD'
DANS :
ma base 'BDD_NEW', dans la table 'TABLE_NEW' dans la colonne 'CHAMP_NEW'.

Je connais la syntaxe :
UPDATE TABLE_NEW SET CHAMP_NEW = TABLE_OLD.CHAMP_OLD;
Mais on doit rester dans la même base de donnée.

Et sinon la syntaxe :
INSERT INTO BDD_NEW.TABLE_NEW SELECT ... FROM BDD_OLD.TABLE_OLD;
Mais dans ce cas, on ne peut pas selectionner les champs a copier.

Je précise enfin que j'utilise MySQL et que mes deux bases ont des noms de table identiques et que les champs de ces tables n'ont pas le même nom.

Merci d'avance pour tout aide et merci de m'avoir lu.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

27 avr. 2006, 11:28

C'est dommage, tu as tous les éléments pour répondre à ta question :
Je connais la syntaxe :
UPDATE TABLE_NEW SET CHAMP_NEW = TABLE_OLD.CHAMP_OLD;
Mais on doit rester dans la même base de donnée.
Et sinon la syntaxe :
INSERT INTO BDD_NEW.TABLE_NEW SELECT ... FROM BDD_OLD.TABLE_OLD;
Mais dans ce cas, on ne peut pas selectionner les champs a copier.
La solution est un petit mélange des 2 ;)

Code : Tout sélectionner

INSERT INTO bdd_new.table_new.champ_new SELECT champ_old FROM bdd_old.table_old
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Xanax_Now
Invité n'ayant pas de compte PHPfrance

27 avr. 2006, 11:49

Merci beaucoup pour ta réponse rapide.

Ouais, j'avais déja essayé (n'étant pas complétement idiot :D) voila l'erreur que sa me renvoie :

INSERT INTO ougarit.objet.num_inventaire
SELECT NI
FROM ougarit_excel.ougarit

Erreur de syntaxe près '.num_inventaire
SELECT NI
FROM ougarit_excel.ougarit' ࠬa ligne 1

A mon avis, on ne peut pas rajouter le nom du champ en plus du nom
de la BDD et du nom de la table ou alors j'ai fait une erreur dans ma requête ?

Xanax_Now
Invité n'ayant pas de compte PHPfrance

27 avr. 2006, 11:51

Mince, je me suis trompé dans ma requete mais j'ai quand même la même erreur :

INSERT INTO ougarit.objet.num_inventaire
SELECT NI
FROM ougarit_excel.objet

#1064 - Erreur de syntaxe pr賠de '.num_inventaire
SELECT NI
FROM ougarit_excel.objet' ࠬa ligne 1

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

27 avr. 2006, 12:10

Faut pas des parenthèses autour des champs plutot que le point ?

Code : Tout sélectionner

INSERT INTO ougarit.objet (num_inventaire) SELECT NI FROM ougarit_excel.objet

Invité
Invité n'ayant pas de compte PHPfrance

27 avr. 2006, 13:10

C'est bizarre, avec ta requete qui semble marcher j'ai le resultat suivant :

Nombre d'enregistrements insérés : 282
Identifiant de l'enregistrement inséré: 565 (traitement: 0.0107 sec.)

Mais dans mon champ num_inventaire de ma table objet dans la BDD ougarit, je n'ai toujours rien ?!

Xanax_Now
Invité n'ayant pas de compte PHPfrance

27 avr. 2006, 13:42

C'est bon sa marche ! Mille merçi pour votre aide. La requete :

Code : Tout sélectionner

NSERT INTO ougarit.objet (num_inventaire) SELECT NI FROM ougarit_excel.objet
est nikelle sauf sur un point (apres sa promis je vous embete plus).

Une fois que j'ai copié donc une colonne dans une autre selon la méthode que j'ai décrite , je veux aussi copier d' autres colonnes OR
quand je fais ceci, la 2eme colonne que je copie se retrouve apres les enregistrements deja effectués.

En clair, j'ai des lignes qui sont RAJOUTEES alors que moi je veux COMPLETER les autres colonnes.

Petit exemple : je copie disons des nom (clé primaire), j'aurai donc dans ma table :
- dupont
- martin
Quand je veux aussi copier les prénoms disons, j'ai sa :
- dupont
- martin
- luc
- marc
Alors que moi je voudrais :
- dupont luc
- martin marc

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

27 avr. 2006, 13:50

C'est normal, la commande insert ne fait que créer de nouvelles lignes et ne met pas à jour, il faut pour cela normalement utiliser update.

Cela dit, tu peux très bien insérer plusieurs champs d'un coup dans ta table en les précisant dans la parenthèse et dans le select :

Code : Tout sélectionner

INSERT INTO ougarit.objet (num_inventaire, champ2, champ3) SELECT NI, champ2, champ3 FROM ougarit_excel.objet
Tu peux aussi dans ton select concatener les colonnes pour ne les insérer que dans un seul champ... tout dépend de tes besoins :)

Invité
Invité n'ayant pas de compte PHPfrance

27 avr. 2006, 13:50

Comme je suis un mec trop cool, je vais me répondre a moi-même :
Voici la requete :

INSERT INTO
ougarit.objet (num_inventaire , num_objet)
SELECT NS,NS
FROM ougarit_excel.objet

En fait il faut tout faire en même temps, l'autre solution serait d'utiliser un UPDATE mais y pas moyen.

Xanax_Now
Invité n'ayant pas de compte PHPfrance

27 avr. 2006, 13:51

Mince j'ai été grillé. Merci bien pour ton aide mec !

Xanax_Now
Invité n'ayant pas de compte PHPfrance

27 avr. 2006, 14:03

Derniere chose : tu parles de concaténer plusieurs champs dans un seul et c'est exactement ce dont j'ai besoin !!
Tout d'abord, sachant que j'ai 2 champs a NULL et 1 champ remplit a chaque fois, est-ce-que la concaténation marchera bien ou faut-il que je remplace le NULL par rien du tout ("").

Ensuite, avec quelle requete puis-je faire cela ?

J'imagine que cette requete va concaténer dans le champs1_bis :
INSERT
INTO ougarit.objet (champ1, champ2, champ3)
SELECT champ1_bis
FROM ougarit_excel.objet

Mais quid quand il y plusieurs champs, mysql ne sait pas quel champs concaténer et ou :
INSERT
INTO ougarit.objet (champ1, champ2, champ3)
SELECT champ1_bis, champ2_bis
FROM ougarit_excel.objet

La, a priori, il va copier champ1 dans champ1_bis et concaténer champ2 ainsi que champ3 dans champ2_bis non ?

Merci beaucoup pour toute aide apportée.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

27 avr. 2006, 14:08

Quand tu fait une requete de ce style là :

Code : Tout sélectionner

INSERT INTO ch1, ch2 SELECT val1, val2 FROM table
Tu indique au SGBD qu'il faut qu'il mette val1 dans ch1 et val2 dans ch2

Ensuite, val1 et val2 peuvent être une conbinaison de champs

Par exemple (j'espère que les noms de champs seront parlant)

Code : Tout sélectionner

INSERT INTO (id_contact, nom_complet) SELECT id_personne, CONCAT(nom_personne, prenom_personne) FROM personne
Si tu veux qu'un champs reste à null, il suffit de ne pas le donner dans la liste des champs à remplir du INSERT (à condition, bien sûr, qu'il ne soit pas obligatoire)

NB : tout ce que je viens de dire est possible pour un update
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Xanax_Now
Invité n'ayant pas de compte PHPfrance

27 avr. 2006, 14:14

Merci, je ne connaissais pas la fonction CONCAT, c'est vrai que c'est assez pratique.

En ce qui concerne les champs a NULL, ce que je voulais dire par la c'est si je fait par exemple :
CONCAT (champ1, champ2, champ3) et qu'a chaque ligne, il y a deux champs a NULL et un TEXT, est-ce que MySQL va arriver a concaténer ces 3 champs ?

En fait il faudrais que je teste a chaque ligne quel champ n'est pas a NULL mais comme je fais tout dans un seul INSERT, je ne peux pas donc tout concaténer me semple la meilleur solution.

Mille merci pour l'aide apportée !

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

27 avr. 2006, 14:18

Sans te garantir le résultat, je pense que la fonction CONCAT arrive à gérer les champs NULL :-k
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Invité
Invité n'ayant pas de compte PHPfrance

27 avr. 2006, 14:22

Merci Zeus !