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 puis-je mettre à jour plusieurs tables dans MySQL avec une seule requête?
mysql
sql
sql-update
Adamski
la source
la source
Réponses:
Prenons le cas de deux tables,
Books
etOrders
. Dans le cas où nous augmentons le nombre de livres dans un ordre particulier avecOrder.ID = 1002
dans leOrders
tableau, nous devons également réduire le nombre total de livres disponibles dans notre stock du même nombre dans leBooks
tableau.la source
Pour voir ce que cela va mettre à jour, vous pouvez le convertir en une instruction de sélection, par exemple:
Un exemple utilisant les mêmes tableaux que l'autre réponse:
ÉDITER:
Juste pour le plaisir, ajoutons quelque chose d'un peu plus intéressant.
Disons que vous avez une table de
books
et une table deauthors
. Vousbooks
avez unauthor_id
. Mais lorsque la base de données a été créée à l'origine, aucune contrainte de clé étrangère n'a été définie et plus tard, un bogue dans le code frontal a provoqué l'ajout de certains livres avec desauthor_id
s invalides . En tant que DBA, vous ne voulez pas avoir à parcourir tous ces élémentsbooks
pour vérifier ce queauthor_id
devrait être, donc la décision est prise que les capteurs de données corrigent lebooks
point à droiteauthors
. Mais il y a trop de livres pour parcourir chacun d'eux et disons que vous savez que ceux qui ont unauthor_id
qui correspond à un réelauthor
sont corrects. Ce sont juste ceux qui n'ont pasauthor_id
s qui ne sont pas valides. Il existe déjà une interface permettant aux utilisateurs de mettre à jour les détails du livre et les développeurs ne veulent pas changer cela uniquement pour ce problème. Mais l'interface existante fait unINNER JOIN authors
, donc tous les livres dont les auteurs sont invalides sont exclus.Voici ce que vous pouvez faire: Insérez un faux enregistrement d'auteur comme "Auteur inconnu". Mettez ensuite à jour le
author_id
de tous les mauvais enregistrements pour pointer vers l'auteur inconnu. Ensuite, les captureurs de données peuvent rechercher tous les livres dont l'auteur est défini sur "Auteur inconnu", rechercher l'auteur correct et les corriger.Comment mettre à jour tous les mauvais enregistrements pour qu'ils pointent vers l'auteur inconnu? Comme ceci (en supposant que l'auteur inconnu
author_id
est 99999):Ce qui précède mettra également à jour
books
qui ont unNULL
author_id
auteur inconnu. Si vous ne le souhaitez pas, vous pouvez bien sûr ajouterAND books.author_id IS NOT NULL
.la source
Vous pouvez également le faire avec une requête en utilisant une jointure comme ceci:
Et puis 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 y a aussi quelques restrictions pour commander et limiter les mises à jour de plusieurs tables que vous pouvez lire ici: http://dev.mysql.com/doc/refman/5.0/en/update.html (juste ctrl + f "join").
la source
C'est généralement à cela que servent les procédures stockées: implémenter plusieurs instructions SQL dans une séquence. En utilisant les annulations, vous pouvez vous assurer qu'elles sont traitées comme une seule unité de travail, c'est-à-dire qu'elles sont toutes exécutées ou qu'aucune d'entre elles ne l'est, pour que les données restent cohérentes.
la source
Lorsque vous dites plusieurs requêtes, vous entendez plusieurs instructions SQL comme dans:
Ou plusieurs appels de fonction de requête comme dans:
Le premier peut être fait en utilisant un seul appel mySqlQuery si c'est ce que vous vouliez réaliser, appelez simplement la fonction mySqlQuery de la manière suivante:
Cela exécutera les trois requêtes avec un seul appel mySqlQuery ().
la source