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 :

Un seul UPDATE sur plusieurs tables : possible ?


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 47
    Points : 25
    Points
    25
    Par défaut Un seul UPDATE sur plusieurs tables : possible ?
    Bonjour

    Pour mettre à jour un article je suis obligé de faire plusiers requets sql car ca touche plusieurs tables donc comme c'est sur un site web c est un peu long.

    Est il possible de regrouper toutes ces requetes d'UPDATE en une seule , et comment

    merci de votre aide

    voici mon code

    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    PROCEDURE SetReqModifArticle(sku, sSDesc, sDesc, sPublish, sSpecial, dMdate, sName, id, mPrix, nISouCategorie)
    m_suffixe = "jos_"
    bOk est un booléen = False
    sErreur est une chaîne
     
    :m_sRequeteUpdateArticle = "UPDATE  " + ...
    :m_sSuffixe+ "vm_product  " + ...
    "SET  " + ...
    "product_sku = '"+ sku +"', " + ...
    "product_s_desc ='"+sSDesc+"', " + ...	
    "product_desc= '"+sDesc+"', " + ...
    "product_publish = '" + sPublish + "',  " + ...	
    "product_special =  '" + sSpecial + "', " + ...
    "mdate =  " + dMdate + ", " + ...
    "product_name = '"+sName+"'  " + ...
    "where product_id = " + id
     
    // on met a jour l'article lui meme ------------------------------------------------
    reqUpdateArticle est une Source de Données
    HAnnuleDéclaration(reqUpdateArticle)
    SI SQLExec(m_sRequeteUpdateArticle, reqUpdateArticle) ALORS
    	bOk = Vrai
    SINON
    	bOk = Faux
    	SQLInfoGene(reqUpdateArticle)
    	//Erreur(SQL.MesErreur)
    	sErreur = SQL.MesErreur
    FIN
     
    HAnnuleDéclaration(reqUpdateArticle)
     
    // on met a jour la table des tarifs -------------------------------------------
    bAjout est booléen = Faux
     
    nICombien est entier = 0
    sTrouevPrixArticle est chaîne =  "SELECT  Count(*) as COMBIEN  FROM " + :m_sSuffixe + "vm_product_price  WHERE product_id = " + id
    reqTrouveTarif est une Source de Données
    HAnnuleDéclaration(reqTrouveTarif)
    SI SQLExec(sTrouevPrixArticle, reqTrouveTarif) ALORS
    	nNbCol est entier = SQL.NbCol
    	SQLPremier(reqTrouveTarif)
    	nICombien = SQLCol(reqTrouveTarif, 1)
    	SI nICombien <= 0 ALORS
    		bAjout = Vrai
    	FIN
    	//trace(nICombien)
    	bOk = Vrai
    SINON
    	bOk = Faux
    	SQLInfoGene(reqTrouveTarif)
    	//Erreur(SQL.MesErreur)
    	sErreur = SQL.MesErreur
    FIN
    HAnnuleDéclaration(reqTrouveTarif)
     
    sTableTarif est chaîne
    SI bAjout = Vrai ALORS
    	sTableTarif = "INSERT INTO  " + :m_sSuffixe + "vm_product_price  (product_id, product_price, mdate, cdate, product_currency, shopper_group_id)  VALUES ( " + id + ","+ mPrix + ", " + dMdate + "," + dMdate + ",'" + gclRequete:GetDevise() + "'," + 5 +")"
    SINON
    	sTableTarif = "UPDATE  " + :m_sSuffixe + "vm_product_price  SET product_price = " + mPrix + ", mdate = " + dMdate + " WHERE product_id = " + id
    FIN
     
    reqUpdateTarif est une Source de Données
    HAnnuleDéclaration(reqUpdateTarif)
    SI SQLExec(sTableTarif, reqUpdateTarif) ALORS
    	bOk = Vrai
    SINON
    	bOk = Faux
    	SQLInfoGene(reqUpdateTarif)
    	//Erreur(SQL.MesErreur)
    	sErreur = SQL.MesErreur
    FIN
    HAnnuleDéclaration(reqUpdateTarif)
     
     
    // On met a jour la tables des categories produit ------------------------------------------------------------------------------------
    sUpdateCategorieProduit est chaîne = "UPDATE  " + :m_sSuffixe + "vm_product_category_xref  SET category_id = " + nISouCategorie + " WHERE product_id = " + id 
    reqUpdateCategorieProduit est une Source de Données
    HAnnuleDéclaration(reqUpdateCategorieProduit)
    SI SQLExec(sUpdateCategorieProduit, reqUpdateCategorieProduit) ALORS
    	bOk = Vrai
    SINON
    	bOk = Faux
    	SQLInfoGene(reqUpdateCategorieProduit)
    	//Erreur(SQL.MesErreur)
    	sErreur = SQL.MesErreur
    FIN
    HAnnuleDéclaration(reqUpdateCategorieProduit)
    // -----------------------------------------------------------------------------------------------------------------------------------
     
    // On met à jour la tables des articles par fournisseur ------------------------------------------------------------------------------
    //HLitRecherchePremier(jos_vm_product_mf_xref,product_id, idARticle)
    //SI HTrouve(jos_vm_product_mf_xref)  ALORS
    //	jos_vm_product_mf_xref.manufacturer_id = idFabricant
    //	HModifie(jos_vm_product_mf_xref)
    //FIN
     
    sUpdateArticleParFournisseur est chaîne = "UPDATE  " + :m_sSuffixe + "vm_product_mf_xref  SET manufacturer_id = " + 1 + " WHERE product_id = " + id 
    reqUpdateArticleParFournisseur est une Source de Données
    HAnnuleDéclaration(reqUpdateArticleParFournisseur)
    SI SQLExec(sUpdateArticleParFournisseur, reqUpdateArticleParFournisseur) ALORS
    	bOk = Vrai
    SINON
    	bOk = Faux
    	SQLInfoGene(reqUpdateArticleParFournisseur)
    	//Erreur(SQL.MesErreur)
    	sErreur = SQL.MesErreur
    FIN
    HAnnuleDéclaration(reqUpdateArticleParFournisseur)
    // --------------------------------------------------------------------------------------------------------------------------------
    // ------------------------------------------------------------------------------
     
    SI bOk ALORS
    	Info("L'article : " + sName  +" a été MAJ...")
    SINON
    	Info("L'article : " + sName  +" n'a pas pu être MAJ..." + CRLF + sErreur)
    FIN

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Non. INSERT et UPDATE n'agissent que sur une seule table.

    Exception concernant UPDATE : la mise à jour en cascade des clés étrangères.
    Mais, en principe, ça n'arrive jamais avec une base bien modélisée puisque une clé étrangère fait référence à une clé primaire et que celle-ci est en principe invariable.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    Il faut soit :

    L'UPDATE, comme tous les ordre SQL de mise à jour ne peut porter que sur une seule table à la fois.
    A lire :http://sqlpro.developpez.com/cours/sqlaz/dml/

    SOLUTIONS :
    1) créer une vue et coder un trigger INSTEAD OF UDPATE sur la vue qui mettra à jour simultanément toutes les tables
    2) créer une procédure stockée qui fera de même
    3) créer les deux, le trigger faisant appel à la procédure stockée.

    Pour un exemple :
    http://blog.developpez.com/sqlpro/p9...pping-ro-dire/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 47
    Points : 25
    Points
    25
    Par défaut
    Merci à vous, mais c est sur une base MySQL donc je vais en rester a un update par table

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    MySQL ou pas, si vous voulez accélérer vos traitements il faut des procédures stockées sur votre base de données, et appeler celles-ci avec des simples paramètres pour faire vos mises à jour.

    Ça vous évitera aussi les injections SQL, parce là votre code c'est une jolie passoire !

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 47
    Points : 25
    Points
    25
    Par défaut
    comment ça passoire ?

    et comment mettre une procédure stockée sur MySQL ?

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820

  8. #8
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par phcm971 Voir le message
    comment ca passoire ?

    et comment mettre une procédure stockée sur MySQL ?
    à ma connaissance pas de procédures stockées avec MySQL ; il faut faire du code natif en langage C.
    Voir sur le site de www.mysql.com

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    MySQL est un ersatz de SGBDR qui n'implémente pas grand chose de ce que l'on devrait pouvoir faire dans un vrai SGBDR !
    A lire : http://blog.developpez.com/sqlpro/p9...udre-aux-yeux/

    Vues bricolages, par de trigger INSTEAD OF, procédures stockées très limitées....

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

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

Discussions similaires

  1. [MS SQL]faire un UPDATE sur plusieurs tables en meme temps
    Par touille dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 18/07/2007, 09h45
  2. UPDATE sur plusieurs tables ?
    Par Mos dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/04/2007, 08h37
  3. Update sur plusieurs tables
    Par yoyopi dans le forum DB2
    Réponses: 4
    Dernier message: 24/07/2006, 08h22
  4. update sur plusieurs tables
    Par Jean-Matt dans le forum Langage SQL
    Réponses: 14
    Dernier message: 04/01/2006, 14h30
  5. un seul SELECT sur plusieurs tables ?
    Par deloo dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/09/2005, 12h57

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