(My) - SQL toplu güncelleştirme

5 Cevap php

Hey, "id", "isim" ve "ağırlık" sütunlu bir tablo var. Ağırlık imzasız küçük int.

Ben "kilo ASC" tarafından sipariş öğeleri görüntüleyen bir sayfa var. Bu sürükle-n-drop kullanacağız, ve sırası değişti sonra, (yeni sırayla) kimlikleri bir virgülle ayrılmış dizisini geçecek.

Kullanıcının bu tablodaki 10 ürün var diyelim. İşte ben bugüne kadar ne var:

Örnek giriş:

5,6,2,9,10,4,8,1,3,7

Örnek PHP işleyicisi (hata işleyicileri ve güvenlik şeyler hariç):

<?php
$weight = 0;
$id_array = explode(',', $id_string);

foreach ($id_array as $key => $val)
{
    mysql_query("UPDATE tbl SET weight = '$weight' where id = '$val' LIMIT 1");
    $weight++;
}
?>

When I make a change to column order, will my script need to make 10 separate UPDATE queries, or is there a better way?

5 Cevap

Yalnızca bir anda bir satır güncelleyebilirsiniz demektir ki, sizin durumunuzda - Yalnızca tek bir sorguda bir where yan tümcesi belirtebilirsiniz.


With 10 items, I don't know if I would go through that kind of troubles (it means re-writing some code -- even if that's not that hard), but, for more, a solution would be to :

  • delete tüm satırlar
  • insert hepsini geri döndü
  • Tabii, bir transaction tüm yapıyor.

Güzel nokta tek bir sorguda birkaç insert s yapabiliyor olmasıdır; 10 öğeleri için bilmiyorum, ama 25 veya 50 için, oldukça güzel olabilir.

İşte bir örnek, gelen insert page of the MySQL manual (quoting):

INSERT statements that use VALUES syntax can insert multiple rows. To do this, include multiple lists of column values, each enclosed within parentheses and separated by commas.
Example:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

Tabii ki, muhtemelen tek bir insert sorgusunda "çok" öğe eklemek gerekir - 50 ürün başına bir ekleme Tamam olabilir, ama (to find the "right" number of items, you'll have to benchmark, I suppose ^^ )

Bu verilerle tablosunu güncelleştirmek sonra, (yani, id ve kilo sütunlar) içinde yeni veri ile geçici bir tablo oluşturabilir.

create temporary table t (id int, weight float);

insert into t(id, weight) values (1, 1.0), (2, 27), etc

update tbl inner join t on t.id = tbl.id
set tbl.weight = t.weight;

Yani, bir deyim, bir insert deyimi, ve bir güncelleme deyimi oluşturmak var.

Evet, 10 güncellemeleri yapmak gerekir. Orada toplu kadar mysql_query tek bir çağrıda birden fazla sorguları için yolu vardır, ama bu önlemek için muhtemelen en iyisidir.

Eğer endişe performans ise, bu endişesi önce bunu deneyin emin olun. Ben 10 (hatta 20 veya 30) yaptığını güncellemeleri bol hızlı olacağını sanıyorum.

10 güncellemeleri kavramsal basit yoludur. Eğer güncelleştirilmesi gereken bir bazillion satır var ise, o zaman böyle bir geçici tablo oluşturma ve sizin UPDATE deyimi ya da bir satır kurucu ile bir alt sorgu JOIN kullanarak farklı bir şey denemek zorunda kalabilirsiniz.

Toplu ekleme ile bir geçici tablodaki kayıtları saklamak ve TBL gelen kayıtları silebilir ve tbl sonra geçici tablodan do toplu insert