web-dev-qa-db-fra.com

MySQL, met à jour plusieurs tables avec une requête

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?

114
Adamski

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;
427
Irfan
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;
60
Wodin

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").

33
Stephen Searles

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 ().

2
code_burgar

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.

0
SteveCav