J'ai une fonction qui met à jour trois tables, mais j'utilise trois requêtes pour effectuer cela. Je souhaite utiliser une approche plus pratique pour les bonnes pratiques.
Comment mettre à jour plusieurs tables dans MySQL avec une seule requête?
Prenons le cas de deux tables, Books
et Orders
. Dans le cas où nous augmentons le nombre de livres dans un ordre particulier avec le tableau Order.ID = 1002
dans Orders
, nous devons également réduire le nombre total de livres disponibles dans notre stock du même nombre dans Books
table.
UPDATE Books, Orders
SET Orders.Quantity = Orders.Quantity+2,
Books.InStock = Books.InStock-2
WHERE
Books.BookID = Orders.BookID
AND Orders.OrderID = 1002;
UPDATE t1
INNER JOIN t2 ON t2.t1_id = t1.id
INNER JOIN t3 ON t2.t3_id = t3.id
SET t1.a = 'something',
t2.b = 42,
t3.c = t2.c
WHERE t1.a = 'blah';
Pour voir ce que cela va mettre à jour, vous pouvez convertir ceci en une instruction select, par exemple:
SELECT t2.t1_id, t2.t3_id, t1.a, t2.b, t2.c AS t2_c, t3.c AS t3_c
FROM t1
INNER JOIN t2 ON t2.t1_id = t1.id
INNER JOIN t3 ON t2.t3_id = t3.id
WHERE t1.a = 'blah';
Un exemple utilisant les mêmes tableaux que l'autre réponse:
SELECT Books.BookID, Orders.OrderID,
Orders.Quantity AS CurrentQuantity,
Orders.Quantity + 2 AS NewQuantity,
Books.InStock AS CurrentStock,
Books.InStock - 2 AS NewStock
FROM Books
INNER JOIN Orders ON Books.BookID = Orders.BookID
WHERE Orders.OrderID = 1002;
UPDATE Books
INNER JOIN Orders ON Books.BookID = Orders.BookID
SET Orders.Quantity = Orders.Quantity + 2,
Books.InStock = Books.InStock - 2
WHERE Orders.OrderID = 1002;
Vous pouvez également le faire avec une requête aussi en utilisant une jointure comme ceci:
UPDATE table1,table2 SET table1.col=a,table2.col2=b
WHERE items.id=month.id;
Et ensuite, envoyez simplement cette requête, bien sûr. Vous pouvez en savoir plus sur les jointures ici: http://dev.mysql.com/doc/refman/5.0/en/join.html . Il existe également quelques restrictions relatives à la commande et à la limitation des mises à jour de tables multiples que vous pouvez consulter ici: http://dev.mysql.com/doc/refman/5.0/en/update.html (juste ctrl + f "rejoindre").
Lorsque vous dites plusieurs requêtes, voulez-vous dire plusieurs instructions SQL comme dans:
UPDATE table1 SET a=b WHERE c;
UPDATE table2 SET a=b WHERE d;
UPDATE table3 SET a=b WHERE e;
Ou plusieurs appels de fonction de requête comme dans:
mySqlQuery(UPDATE table1 SET a=b WHERE c;)
mySqlQuery(UPDATE table2 SET a=b WHERE d;)
mySqlQuery(UPDATE table3 SET a=b WHERE e;)
La première peut être effectuée à l’aide d’un seul appel mySqlQuery si c’est ce que vous souhaitiez obtenir. Appelez simplement la fonction mySqlQuery de la manière suivante:
mySqlQuery(UPDATE table1 SET a=b WHERE c; UPDATE table2 SET a=b WHERE d; UPDATE table3 SET a=b WHERE e;)
Cela exécutera les trois requêtes avec un seul appel mySqlQuery ().
C’est généralement à cela que servent les procédures stockées: implémenter plusieurs instructions SQL dans une séquence. À l'aide des restaurations, vous pouvez vous assurer qu'elles sont traitées comme une unité de travail, c'est-à-dire qu'elles sont toutes exécutées ou qu'aucune d'entre elles ne le sont, afin de maintenir la cohérence des données.