web-dev-qa-db-fra.com

MySql met à jour deux tables à la fois

J'ai deux tables qui ont besoin des mêmes valeurs exactes à des fins de dénormalisation.

Voici la requête.

première table

UPDATE Table_One 
SET win = win+1, streak = streak+1, score = score+200 
WHERE userid = 1 AND lid = 1 LIMIT 1

deuxième table

UPDATE Table_Two 
SET win = win+1, streak = streak+1, score = score+200 
WHERE userid = 1 LIMIT 1

Comme vous pouvez le constater, la seule différence entre les deux tables est leur nom et la table deux n'a pas le champ lid 

Quoi qu'il en soit, combiner les deux mises à jour à une seule?

20
user962449

Cela devrait être possible avec une mise à jour multi-table, comme décrit dans la documentation.

http://dev.mysql.com/doc/refman/5.5/fr/update.html

UPDATE Table_One a INNER JOIN Table_Two b ON (a.userid = b.userid)
SET
  a.win = a.win+1, a.streak = a.streak+1, a.score = a.score+200,
  b.win = b.win+1, b.streak = b.streak+1, b.score = b.score+200 
WHERE a.userid = 1 AND a.lid = 1 AND b.userid = 1

Remarque: Multi-table ne prend pas en charge LIMIT, cela pourrait donc causer plus de problèmes en fonction des détails. 

Les procédures stockées ou les transactions peuvent être une solution plus intéressante.

40
rrehbein

S'il existe une relation un à un ou un à plusieurs de Table_One à Table_Two, ceci fonctionnerait:

UPDATE Table_One T1, Table_Two T2 
SET T1.win = T1.win+1, T1.streak = T1.streak+1, T1.score = T1.score+200, 
    T2.win = T2.win+1, T2.streak = T2.streak+1, T2.score = T2.score+200 
WHERE T1.userid = 1 AND T1.lid = 1 AND T2.userid = T1.userid;
8
Atonewell

Il s’agit de deux requêtes distinctes et doivent donc être traitées comme telles. Désolé de le dire, mais si vous mettez à jour deux tables avec des données identiques, il existe probablement un meilleur moyen de concevoir votre base de données. N'oubliez pas de garder votre programmation _ SÈCHE .

Edit: devrait rétracter cela; vous pouvez l’utiliser pour plusieurs tables, mais vous ne pouvez pas utiliser ORDER BY ou LIMIT.

0
Thomas Edwards

Si vous pouvez joindre les tables, vous pouvez créer une vue de deux tables, puis mettre à jour via cette vue. Dans votre exemple, il semble que userid pourrait être une clé appropriée.

Lors de la création de la vue, vous devez vous en tenir à la instructions suivantes .

0
James Bradbury