Ben tek bir SQL sorguda birden güncellemeleri nasıl yapabilirim?

8 Cevap php

Tamam, burada durum: Ben böyle bir SQL sorgusu vardır:

UPDATE foo
SET flag=true
WHERE id=?

Şimdi, kimliklerinin bir listesi vardır bir PHP dizi var. Gibi bir şey ayrıştırma dışında bunu yapmanın düzgün bir yolu var mı:

foreach($list as $item){  
    $querycondition = $querycondition . " OR " . $item;  
}

ve nerede yan tümcesi o kullanıyor?

8 Cevap

Bu aynı şeyi başarmak istiyorum, ama muhtemelen bir hız artışı çok verim, ama güzel görünüyor değil.

mysql_query("UPDATE foo SET flag=true WHERE id IN (".implode(', ',$list).")");

Sen (veritabanı destekliyorsa varsayarak) IN yan tümcesi kullanmak gerekir:

UPDATE foo SET flag=true WHERE id in (1, 2, 3, 5, 6)

IN deyimini kullanın. Anahtar değerleri virgülle ayrılmış listesini sağlar. Kolayca implode fonksiyonunu kullanarak yapabilirsiniz.

UPDATE foo SET flag = true WHERE id IN (1, 2, 3, 4, 5, ...)

Alternatif koşulunu kullanabilirsiniz:

UPDATE foo SET flag = true WHERE flag = false

veya alt sorgu:

UPDATE foo SET flag = true WHERE id IN (SELECT id FROM foo WHERE .....)

Kullanım ile sonuna kadar virgülle ayrılmış bir listesini yapmak / çöktüğünü join:

UPDATE foo SET flag=true WHERE id IN (1,2,3,4)

Ben hiç foreach döngüsü dışında başka bir yapmak için bir yol görmedim.

$ Liste kullanıcı kazanılmış herhangi bir şekilde eğer Ama, eğer hazırlanmış deyimi kullanarak ve sadece (birisi hazırlanmış bir deyimi ile birkaç satır güncellemek için bir yol yok varsayarak) bir seferde bir satır güncelleştirme ayrılmamak gerekir. Aksi takdirde, geniş sql enjeksiyon açıktır.

Eğer durum açıklamaları ile güncelleyebilirsiniz sıkışabilir ancak kendi sorgu oluşturmak zorunda olacak.

UPDATE foo
SET flag=CASE ID WHEN 5 THEN true ELSE flag END  
    ,flag=CASE ID WHEN 6 THEN false ELSE flag END 
WHERE id in (5,6)

Nerede atlanmış ama tam bir tablo güncelleme sizi kurtarır.

VB.NET code: dim delimitedIdList as string = arrayToString(listOfIds)

dizge olarak SQL dim = "UPDATE foo SET bayrak = true WHERE id (" + delimitedIdList + ")"

SQLÇalıştır (SQL)

: Öğelerin sayısına bir sınır biliyorum, o başkalarının önerdi gibi "IN" yan tümcesi, kullanın

UPDATE foo SET flag=true WHERE id in (1, 2, 3, 5, 6)

One warning though, is that depending on your db there may be a limit to the number of elements in the clause. Eg oracle 7 or 8 (?) used to have a limit of 256 items (this was increased significantly in later versions)
If you do iterate over a list use a transaction so you can rollback if one of the updates fails