2009-10-05 8 views
2

J'ai une question concernant la mise à jour multi-tables (MySQL). Considérons les tableaux t1 et t2. Le PKEY pour t1 est 'tid' qui est une clé étrangère dans t2. Il y a un champ "qtyt2" dans t2 qui dépend d'un champ appelé "qtyt1" dans la table t1. Considérez l'instruction SQL suivante:Mise à jour multi-tables (MySQL)

UPDATE t2,t1 
    SET t2.qtyt2=IF((t2.qtyt2- t1.qtyt1)<0,0,(t2.qtyt2- t1.qtyt1)), 
     t1.qtyt1 ="Some value.." 
WHERE t2.tid="some value.." 
    AND t2.tid=t1.tid 

Dans cet exemple qtyt2 dépend de qtyt1 pour la mise à jour et ce dernier est lui-même updated.Now le résultat doit retourner 2 si deux lignes sont mises à jour. Y at-il une garantie que les champs seront mis à jour dans l'ordre dans lequel ils apparaissent dans la déclaration (qtyt2 premier sera défini, puis qtyt1)?

Est-il possible que qtyt1 sera défini en premier, puis qtyt2?

L'ordre des tables dans l'instruction est-il important (UPDATE t2, t1 ou UPDATE t1, t2)?

J'ai trouvé que si j'écrivais "UPDATE t1, t2" alors seulement t1 serait mis à jour, mais en changeant l'instruction à "UPDATE t2, t1" tout a fonctionné correctement.

Répondre

2

Tout d'abord, il est toujours conseillé de rendre vos JOINs explicites. Et le 2ème, je pense que votre condition a une faute de frappe et devrait être WHERE t2.qtyt2='Some value..'. Alors:

UPDATE t2 JOIN t1 ON (t2.tid=t1.tid) 
SET t2.qtyt2= IF((t2.qtyt2- t1.qtyt1)<0, 0,(t2.qtyt2- t1.qtyt1)), 
    t1.qtyt1 ="Some value.." 
WHERE t2.qtyt2="Some value.."; 

Si ce qui précède est ce que vous voulez dire, alors je crois que ce qui devrait se produire est que SQL se trouve la ligne du jeu où t2.qtyt2="Some value..", il mettra à jour t2.qtyt2, puis il sera mis tout t1 .qtyt1 (dans l'ensemble de lignes) à "Une certaine valeur .." (et non la nouvelle valeur de t2.qtyt2).

0

Je ne crois pas que MySQL puisse garantir l'ordre dans lequel les mises à jour auront lieu. Le seul moment qui importe de toute façon est lors de l'utilisation de tables InnoDB avec des contraintes de clé étrangère, et la documentation indique spécifiquement que la commande n'est pas garantie et que la mise à jour peut échouer en conséquence. Dans ce cas, vous devez utiliser des instructions de mise à jour séparées, ce qui ne devrait pas poser de problème en raison de l'isolation des transactions que vous recevez avec InnoDB.