2009-06-18 12 views
11
'a ayarlanması

Satırların seçim alanını 0 olarak güncellemek için verimli bir yol var mı, ancak bu satırlardan birini bir taneye göre 1 olarak ayarlayın.MySQL: Bir alanı 0 olarak ayarlayan tüm satırların güncellenmesi, ancak bir satırın alanının 1

Temel olarak, bir veritabanında birden çok nesneyim var ve hangisinin "inuse" olduğu arasında geçiş yapmak istiyorum, bu yüzden sorgu satırlardan birini (kimliğine göre) inuse = 1 ve diğerlerini inuse = 0. id ABCD ve 0 aksi takdirde

Teşekkür :)

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

cevap

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

Bu çok zariftir :) –

+0

Bunun sizden daha hızlı/daha verimli olduğunu düşünüyor musunuz? – Joel

+0

Sanırım aynısı değilse, hemen hemen aynı. –

11

Tabii INUSE alanını 1 açardı.

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

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

örnek

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

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

veya daha kısa

update tbl set inuse = test; 

deneyin

Bu yalnızca ilgili satırları güncelleyecektir.

0

Bir bayrağın ayarlanmasından sonra, kodun başka bir kısmı aynı anda aynı nesneyi kullanmazsa, çağıran kod inuse = 1 değerini ayarlar ve tamamlandığında sıfırlarsa daha iyi olur. Aksi halde bir nesneyi (satır) inuse olarak işaretlemek için bir iş parçacığı sonlanacak ve başka bir iş parçacığı başka bir nesneye ihtiyaç duyuyorsa, yine de kullanımda olanı ilk olarak sıfırlayacaktır.

bu durum böyle değil ve sadece biri için inuse ayarlanır ve tüm diğerlerini sıfırlayabileceksiniz istiyorsanız kullanabilirsiniz:

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

veritabanı işlemleri kullanıyorsa, bu en iyi yoldur bunu yapmak için: bu taşınabilir beri

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

Eğer işlemleri kullanmıyorsanız, o zaman VAKA kullanan diğer cevabı en iyi seçenektir. ancak iki UPDATE ifadesinden daha fazla CPU zamanı gerektirir.

İlgili konular