2009-12-09 6 views

Répondre

3

Oui vous pouvez mais cela nécessiterait une table (si seulement virtuel/temporaire), où vous stockez les paires de valeur id + ts, puis exécutez une UPDATE avec la syntaxe FROM.
En supposant que tmpList est une table avec un id et une colonne ts_value, rempli avec les paires de valeur d'id, la valeur ts que vous souhaitez appliquer.

UPDATE table, tmpList 
    SET table.ts = tmpList.ts_value 
WHERE table.id = tmpList.id 
    -- AND table.id IN (1, 2, 3, .. n) 
    -- above "AND" is only needed if somehow you wish to limit it, i.e 
    -- if tmpTbl has more idsthan you wish to update 

approche Une table peut-être moins (mais similaire) impliquerait une déclaration de cas, comme dans:

UPDATE table 
    SET ts = CASE id 
     WHEN 1 THEN 'ts_1' 
     WHEN 2 THEN 'ts_2' 
     -- .. 
     WHEN n THEN 'ts_n' 
    END 
    WHERE id in (1, 2, ... n) -- here this is necessary I believe 
+0

Est-ce performant? – user198729

+0

La forme basée sur les tables est assez performante; il est effectivement plus efficace qu'une série d'instructions UPDATE (mais implique bien entendu la création de cette table temporaire: si une telle table n'existe pas, le temps et les efforts nécessaires pour la créer compenseraient largement les avantages de la mise à jour unique). Le formulaire basé sur CASE est probablement légèrement moins efficace qu'une série d'instructions UPDATE (cela dépend du nombre de cas/enregistrements mis à jour) – mjv

+0

Je choisirai la solution basée sur la table, mais comment l'utiliser pour mettre à jour deux tables avec la même – user198729

-2

ts_1, ts_2, ts_3, etc. sont différents champs de la même table? Il n'y a aucun moyen de le faire avec une seule déclaration.

+0

Devinez, ils devraient être lus comme des chaînes – Tillebeck

4

Utilisez ceci:

UPDATE `table` SET `ts`=CONCAT('ts_', `id`); 
+0

Non, vous prenez l'inverse ... – user198729

1

Eh bien, sans savoir ce que les données, je ne suis pas sûr que la réponse est oui ou non.

Il est certainement possible de mettre à jour plusieurs lignes à la fois:

update table table1 set field1='value' where field2='bar' 

Cela mettra à jour toutes les lignes de table2 dont la valeur est field2 « bar ».

update table1 set field1='value' where field2 in (1, 2, 3, 4) 

Ceci mettra à jour chaque ligne de la table dont la valeur field2 est 1, 2, 3 ou 4.

update table1 set field1='value' where field2 > 5 

Ceci mettra à jour chaque ligne de la table dont la valeur field2 est supérieur à 5.

update table1 set field1=concat('value', id) 

Cela mettra à jour toutes les lignes de la table, le réglage de la valeur champ1 à la « valeur » ainsi que la valeur du champ id de cette ligne.

1

Vous pouvez le faire avec une déclaration de cas, mais il ne serait pas assez:

UPDATE table 
SET ts = CASE id WHEN 1 THEN ts_1 WHEN 2 THEN ts_2 ... WHEN n THEN ts_n END 
+0

Vous semble m'avoir, mais je me soucie de la performance? – user198729

+0

Je ne peux pas dire avec certitude, mais je suppose que CAS utilisera des index sur le champ id. Si vous y réfléchissez, il s'agit simplement de vérifier l'égalité des valeurs et de renvoyer la valeur correspondante pour la mise à jour. Cela dit, le profilage est toujours la meilleure option pour vérifier les performances. – Rory

+0

OOOH, en ajoutant WHERE id IN (1, 2, ... n) devrait aider à la performance. Désolé de ne le réaliser que maintenant, il est 4h30 ici^_^ – Rory

0

Je pense que vous devez élargir le contexte du problème. Pourquoi voulez-vous/avez-vous besoin de toutes les mises à jour en une seule déclaration? Quel avantage cela vous apporte-t-il? Il y a peut-être un autre moyen d'obtenir cet avantage.
Vous êtes probablement en train d'interagir avec sql via du code, donc vous pouvez simplement vous assurer que les trois mises à jour se font toutes de manière atomique en créant une fonction qui effectue les trois mises à jour.

par exemple. pseudocode:

function update_all_three(val){ 
// all the updates in one function 
} 

La différence entre une seule mise à jour de la fonction et une sorte de mise à jour qui effectue plusieurs mises à jour à la fois est probablement pas une distinction très utile.

0

générer les instructions:

select concat('update table set ts = ts_', id, ' where id = ', id, '; ') 
from table 

ou créer les conditions de cas, puis connectez-le à votre déclaration de mise à jour:

select concat('when ', id, ' then ts_', id) from table 
0

Vous pouvez utiliser INSERT ... Duplicate KEY UPDATE. Voyez-vous cette question: Multiple Updates in MySQL

+0

Mauvaise idée; cela supprime l'enregistrement en premier lorsqu'il existe; échec des contraintes ou signora à vos enregistrements dépendants si vous avez ON DELETE CASCADE. –

Questions connexes