Mettre à jour plusieurs lignes avec des valeurs différentes dans une seule requête SQL
J'ai une base de données SQLite avec table myTable
et les colonnes id
posX
posY
. Le nombre de lignes est en constante évolution (augmentation ou diminution). Si je connais la valeur de id
pour chaque ligne, et le nombre de lignes, puis-je faire une seule requête SQL pour mettre à jour tous les posX
et posY
champs avec des valeurs différentes en fonction de l'id?
Par exemple:
---------------------
myTable:
id posX posY
1 35 565
3 89 224
6 11 456
14 87 475
---------------------
Requête SQL pseudocode:
UPDATE myTable SET posX[id] = @arrayX[id], posY[id] = @arrayY[id] "
@arrayX
et @arrayY
sont des tableaux qui stockent de nouvelles valeurs pour les posX
et posY
champs.
Si, par exemple, arrayX
et arrayY
contenir les valeurs suivantes:
arrayX = { 20, 30, 40, 50 }
arrayY = { 100, 200, 300, 400 }
... puis la base de données après que la requête devrait ressembler à ceci:
---------------------
myTable:
id posX posY
1 20 100
3 30 200
6 40 300
14 50 400
---------------------
Est-ce possible? Je suis à jour d'une ligne par requête en ce moment, mais ça va prendre des centaines de requêtes que le nombre de lignes augmente. Je suis en train de faire tout cela dans l'AIR par la manière.
source d'informationauteur astralmaster
Vous devez vous connecter pour publier un commentaire.
Il ya un couple de façons de le faire décemment efficacement.
Première
Si possible, vous pouvez faire une sorte de bulk insert dans une table temporaire. Cela dépend un peu de votre SGBDR/langue du pays d'accueil, mais au pire cela peut être accompli avec un simple SQL dynamique (à l'aide d'un
VALUES()
clause), puis une mise à jour standard à partir d'une autre table. La plupart des systèmes fournissent des utilitaires pour le chargement en masse, siDeuxième
Et c'est un peu SGBDR dépendante ainsi, vous pouvez créer une dynamique de mise à jour de la déclaration. Dans ce cas, où la
VALUES(...)
clause à l'intérieur de la CCE a été créé à la volée:(Selon la documentation, ce devrait être valide SQLite syntaxe, mais je ne peux pas le faire fonctionner dans un violon)
Oui, vous pouvez le faire, mais je doute que cela permettrait d'améliorer les performances, à moins que votre requête a un vrai gros temps de latence.
Que vous pouvez faire:
Le coût total est donné, plus ou moins par: NUM_QUERIES * ( COST_QUERY_SETUP + COST_QUERY_PERFORMANCE ). De cette façon, vous renversez un peu sur NUM_QUERIES, mais COST_QUERY_PERFORMANCE monte bigtime. Si COST_QUERY_SETUP est vraiment énorme (par exemple, vous êtes à l'appel de certains services réseau qui est réel lent) alors, oui, vous pourrait encore se retrouver sur le dessus.
Sinon, j'ai essayer avec une indexation sur l'id ou la modification de l'architecture.
Dans MySQL, je pense que vous pourriez le faire plus facilement avec un multiple INSÉRER SUR le DOUBLE de la CLÉ de mise à JOUR (mais je suis pas sûr, je n'ai jamais essayé).
Quelque chose comme ça pourrait fonctionner pour vous:
Si l'un des posX ou posY valeurs sont les mêmes, alors ils pourraient être combinées en une seule requête
Essayer avec "mise à jour de la tablette set (row='valeur' where id=0001'), (row='valeur2' where id=0002'), ...