2009-06-18 3 views

Répondre

22
UPDATE `table` 
SET `inuse` = (`id` = 23) 
+1

Ceci est assez élégant aussi :) –

+0

Pensez-vous que c'est plus rapide/plus efficace que vous êtes Artem? – Joel

+0

Je pense que c'est à peu près la même chose, sinon exactement la même chose. –

11

Bien sûr

UPDATE table SET inuse=IF(id=ABCD, 1, 0) 

activerait le champ inuse à 1 si id est ABCD et 0 sinon.

0
UPDATE myTable 
SET Field = 0 
WHERE FieldID <> [WhateverID] 

UPDATE myTable 
SET Field = 1 
WHERE FieldId = [WhateverID] 
0

Essayez

update tbl set inuse = if(test, 1, 0); 

ou moins

update tbl set inuse = test; 

par exemple

update tbl set inuse = name = 'foo'; 
1
UPDATE table 
SET  inuse = (id = @id) 
WHERE id = @id 
     OR inuse 

Cela mettra à jour uniquement les lignes pertinentes.

0

Si vous souhaitez définir un indicateur, aucune autre partie du code n'utilise le même objet en même temps, il est préférable que le code appelant active inuse = 1 et le réinitialise une fois terminé. Sinon, vous finirez un thread pour marquer un objet (ligne) comme inuse, et si un autre thread a besoin d'un autre objet, il réinitialisera le premier, tout en étant toujours utilisé.

Si ce n'est pas le cas, et que vous voulez juste être en mesure de mettre inuse pour un, et de réinitialiser tous les autres, vous pouvez utiliser:

UPDATE myTable 
SET InUse = CASE 
    WHEN myTable.id = @id THEN 1 
    ELSE 0 
END 
0

si votre base de données utilise des transactions, c'est la meilleure façon de le faire:

update myTable set inuse = 0; 
update myTable set inuse = 1 where id = ?; 

si vous utilisez les transactions, l'autre réponse avec CASE est la meilleure option car il est portable. mais il faudra plus de temps CPU que les deux instructions UPDATE.

Questions connexes