IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Modifier 2 (ou plus) de tables en meme temps


Sujet :

Langage SQL

  1. #1
    Membre expérimenté Avatar de nebule
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    1 507
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 507
    Points : 1 464
    Points
    1 464
    Par défaut Modifier 2 (ou plus) de tables en meme temps
    Bonjour,

    Je voudrai modifier 2 tables en une seule requête type :
    UPDATE collaborateur C, coordonnees CO

    SET C.nom = 'MONTIGNY',
    C.prenom = 'MARIE',
    C.matricule = '803130',
    C.am = 'non',

    CO.adresse1='toto',
    CO.adresse2='titi',
    CO.cp='0',
    CO.ville='NAnte',
    CO.tel_perso='34',
    CO.tel_portable='56',
    CO.tel_bureau='78',
    CO.e_mail='toto@toto.Fr',
    CO.nom_personne_contact='marie',
    CO.tel_personne_contact='344',

    WHERE C.identifiant_personnel = '40'
    AND C.identifiant_coordonnes=CO.identifiant_coordonnes;
    Mais est-ce seulement possible ?

    Si oui, surement pas comme cela car j'ai une erreur avec MySql :

    #1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE C.identifiant_personnel = '40'
    AND C.identifiant_coordo
    Merci
    Marie
    (\ _ /)
    (='.'=)
    (")-(")

  2. #2
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Non, je ne crois pas que cela soit possible, tu as la notion de transaction pour gérer les mises à jour cohérentes.
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 12
    Points : 16
    Points
    16
    Par défaut
    En virant la virgule à la fin de

    CO.tel_personne_contact='344',

    cela marcherait peut-être mieux, non ?

  4. #4
    Membre expérimenté Avatar de nebule
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    1 507
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 507
    Points : 1 464
    Points
    1 464
    Par défaut
    Apparement, ce n'est pas possible... car meme sans la virgule, il me dit qu'il ne connait pas la deuxiéme table...
    Donc je vais faire en plusieurs tables.
    Tant pis

    Merci quand meme
    Marie
    (\ _ /)
    (='.'=)
    (")-(")

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 12
    Points : 16
    Points
    16
    Par défaut
    Je suis une quiche en SQL, mais ça, je maintiens que sous MySQL, c'est possible,
    Alors j'étale ma science ... Imaginons 3 tables,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    +---------------------+   +----------------------------------+   +---------------------+
    |    t_prenom_pre     |   |        t_caractere_car           |   |    t_forme_for      |
    +--------+------------+   +--------+------------+------------+   +--------+------------+
    | pre_id | pre_prenom |   | car_id | car_humeur | car_tonus  |   | for_id | for_forme  |
    +--------+------------+   +--------+------------+------------+   +--------+------------+
    |    1   |   jean     |   |    1   |     10     |    100     |   |    1   |     0      |
    |    2   |   paul     |   |    2   |     20     |     30     |   |    2   |     0      |
    |    3   |   marc     |   |    3   |     30     |     10     |   |    3   |     0      |
    |    4   |   eric     |   |    4   |     40     |     30     |   |    4   |     0      |
    +--------+------------+   +--------+------------+------------+   +--------+------------+
    On imagine que les ids sont liés.

    Ma requête : Je veux, pour "marc",
    - faire le produit de l'humeur par le tonus (table t_caractere_car),
    - additionner ce résultat au contenu de la table forme,
    - le ranger dans la table forme,
    - reinitialiser les valeurs "humeur" à 2 et "tonus" à 4.

    Un coup de Braguette Magique et hop :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    UPDATE
                t_prenom_pre
    INNER JOIN
                t_caractere_car 
                ON car_id = pre_id 
    INNER JOIN 
                t_forme_for 
                ON for_id = car_id 
    SET 
                for_forme = for_forme + car_humeur * car_tonus,
                car_humeur = 2,
                car_tonus = 4
    WHERE
                pre_prenom = "marc"
    L'ensemble devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    +---------------------+   +----------------------------------+   +---------------------+
    |    t_prenom_pre     |   |        t_caractere_car           |   |    t_forme_for      |
    +--------+------------+   +--------+------------+------------+   +--------+------------+
    | pre_id | pre_prenom |   | car_id | car_humeur | car_tonus  |   | for_id | for_forme  |
    +--------+------------+   +--------+------------+------------+   +--------+------------+
    |    1   |   jean     |   |    1   |     10     |    100     |   |    1   |     0      |
    |    2   |   paul     |   |    2   |     20     |     30     |   |    2   |     0      |
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    |    3   |   marc     |   |    3   |      2     |      4     |   |    3   |    300     |
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    |    4   |   eric     |   |    4   |     40     |     30     |   |    4   |     0      |
    +--------+------------+   +--------+------------+------------+   +--------+------------+
    Si tu passes par phpMyAdmin, tu verras qu'il y a bien 2 enregistrements modifiés correspondants aux deux tables modifiées.

    Ma théorie est donc pour l'update multi-table :

    "UPDATE" ma_première_table
    JOINTURE Table #2
    JOINTURE Table #3
    JOINTURE Table #...
    UPDATE des champs proprement dit, l'ordre des affectations de champs ne semblant pas avoir d'incidence sur le résultat ( qui l'êut cru ? )
    Le PREDICAT ( note qu'en l'absence de ce dernier, tu peux integrer un paramètre de limte qui compte le nombre d'enregistrements modifiés

    GROUP BY, ORDER, LIMIT etc ...

    Maintenant, comme je disais en préambule, je reste une quiche en SQL. Peut-être y-a-t'il des contre-indications à ce procédé, je n'en sais foutre rien.
    Personellement, je l'utilise à foison car je suis une grosse feignasse et je n'ai encore jamais rencontré de problèmes.
    Néanmoins, si un érudit de passage pouvait graisser ce post de son savoir, je suis bien entendu preneur...

    Q : MySQL vérouille t'il l'ensemble des tables avant de faire son update ?
    Q : L'ordre des table a-t'il une incidence ?
    Q : Idem pour l'ordre d'affectation des champs , jusqu'où peut aller la chienlit ?
    Q : MySQL étant un peu boiteux, ce procédé est-il déconseillé dans un environnement d'accès concurentiels intensifs ?

    Autant de questions ... Qui ne m'empêchent pas de dormir mais bon ...

    Félix.

    Ci-dessous, le Dump de l'exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    - --------------------------------------------------------
     
    -- 
    -- Structure de la table `t_caractere_car`
    -- 
     
    CREATE TABLE `t_caractere_car` (
      `car_id` int(10) unsigned NOT NULL auto_increment,
      `car_humeur` int(10) unsigned NOT NULL default '0',
      `car_tonus` int(10) unsigned NOT NULL default '0',
      PRIMARY KEY  (`car_id`)
    ) TYPE=MyISAM AUTO_INCREMENT=5 ;
     
    -- 
    -- Contenu de la table `t_caractere_car`
    -- 
     
    INSERT INTO `t_caractere_car` VALUES (1, 10, 100);
    INSERT INTO `t_caractere_car` VALUES (2, 20, 30);
    INSERT INTO `t_caractere_car` VALUES (3, 30, 10);
    INSERT INTO `t_caractere_car` VALUES (4, 40, 30);
     
    -- --------------------------------------------------------
     
    -- 
    -- Structure de la table `t_forme_for`
    -- 
     
    CREATE TABLE `t_forme_for` (
      `for_id` int(10) unsigned NOT NULL auto_increment,
      `for_forme` int(10) unsigned NOT NULL default '0',
      PRIMARY KEY  (`for_id`)
    ) TYPE=MyISAM AUTO_INCREMENT=6 ;
     
    -- 
    -- Contenu de la table `t_forme_for`
    -- 
     
    INSERT INTO `t_forme_for` VALUES (1, 0);
    INSERT INTO `t_forme_for` VALUES (2, 0);
    INSERT INTO `t_forme_for` VALUES (3, 0);
    INSERT INTO `t_forme_for` VALUES (4, 0);
     
    -- --------------------------------------------------------
     
    -- 
    -- Structure de la table `t_prenom_pre`
    -- 
     
    CREATE TABLE `t_prenom_pre` (
      `pre_id` int(10) unsigned NOT NULL auto_increment,
      `pre_prenom` text NOT NULL,
      PRIMARY KEY  (`pre_id`)
    ) TYPE=MyISAM AUTO_INCREMENT=5 ;
     
    -- 
    -- Contenu de la table `t_prenom_pre`
    -- 
     
    INSERT INTO `t_prenom_pre` VALUES (1, 'jean');
    INSERT INTO `t_prenom_pre` VALUES (2, 'paul');
    INSERT INTO `t_prenom_pre` VALUES (3, 'marc');
    INSERT INTO `t_prenom_pre` VALUES (4, 'eric');

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Modifier plusieurs lignes de tables en meme temps
    Par helrick dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 12/07/2007, 11h18
  2. Insertion dans plusieurs tables en meme temps
    Par weed dans le forum Requêtes
    Réponses: 5
    Dernier message: 04/07/2007, 11h13
  3. cherche a vider plusieurs tables en meme temps?
    Par nenekes dans le forum Langage SQL
    Réponses: 10
    Dernier message: 01/02/2007, 18h58
  4. Réponses: 3
    Dernier message: 19/05/2006, 11h37
  5. remplir deux tables en meme temps
    Par rafawel dans le forum Langage SQL
    Réponses: 4
    Dernier message: 14/06/2005, 16h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo