Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/06/2011, 00h04   #1
Candidat au titre de Membre du Club
 
Inscription : janvier 2010
Messages : 40
Détails du profil
Informations personnelles :
Âge : 62
Localisation : Dom-Tom

Informations forums :
Inscription : janvier 2010
Messages : 40
Points : 10
Points : 10
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 :
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
phcm971 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2011, 00h12   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 008
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 008
Points : 18 279
Points : 18 279
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2011, 08h56   #3
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 954
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 954
Points : 17 774
Points : 17 774
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
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2011, 10h59   #4
Candidat au titre de Membre du Club
 
Inscription : janvier 2010
Messages : 40
Détails du profil
Informations personnelles :
Âge : 62
Localisation : Dom-Tom

Informations forums :
Inscription : janvier 2010
Messages : 40
Points : 10
Points : 10
Merci à vous, mais c est sur une base MySQL donc je vais en rester a un update par table
phcm971 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2011, 11h10   #5
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
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 !
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/06/2011, 23h17   #6
Candidat au titre de Membre du Club
 
Inscription : janvier 2010
Messages : 40
Détails du profil
Informations personnelles :
Âge : 62
Localisation : Dom-Tom

Informations forums :
Inscription : janvier 2010
Messages : 40
Points : 10
Points : 10
comment ça passoire ?

et comment mettre une procédure stockée sur MySQL ?
phcm971 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 00h04   #7
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
http://lmgtfy.com/?q=MySQL+proc%C3%A9dure+stock%C3%A9e
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 00h48   #8
Expert Confirmé Sénior
 
Développeur informatique
Inscription : novembre 2006
Messages : 4 215
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 : 4 215
Points : 5 291
Points : 5 291
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
__________________
Alea Jacta Est
Mat.M est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 10h49   #9
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 954
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 954
Points : 17 774
Points : 17 774
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
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h32.


 
 
 
 
Partenaires

Hébergement Web