2009-09-15 99 views
1

嘿,我有一個表「ID」,「名稱」,「重量」列。權重是一個無符號的小整數。(我的)SQL - 批量更新

我有一個頁面顯示按「weight ASC」排序的項目。它將使用拖放操作,一旦訂單發生變化,將傳遞逗號分隔的id字符串(按照新訂單)。

假設該表中有10個項目。這是我到目前爲止有:

樣品輸入:

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

示例PHP處理程序(錯誤處理&安全的東西除外):

<?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++; 
} 
?> 

當我進行了更改列的順序,我的腳本需要做10個獨立的UPDATE查詢,還是有更好的方法?

回答

3

您只能在一個查詢中指定一個where子句 - 對於您的情況,這意味着您一次只能更新一行。


隨着10個項目,我不知道我是否會經歷那樣的煩惱(這意味着重新編寫一些代碼 - 即使這並不難),但是,更多的,一解決辦法是:

  • delete所有行
  • insertš他們都回來了
  • 拼盡全力,在一個transaction,當然。

好的一點是,您可以在單個查詢中執行多個insert;不知道10件物品,但25或50,它可能是相當不錯的。

下面是一個例子,從insert page of the MySQL manual(引用):使用VALUES 語法可以插入多行

INSERT語句。要做 這個,包含多列 值的列表,每列值括在 括號內,並用逗號分隔。
例子:

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

當然,你可能不應該在一個單一插入查詢插入「太多」項目 - 每50個項目插入可能是好的,但(找到「正確的「項目的數量,你將不得不基準,我想^^)

+0

謝謝大家。 – Matt 2009-09-15 20:50:55

1

是的,你需要做10次更新。有一些方法可以在一次調用中將多個查詢加入到mysql_query中,但最好避免這種情況。

如果是您擔心的表現,請確保您在擔心之前先嚐試一下。我懷疑做10次(甚至20次或30次)更新會很快。

1

10更新是最簡單的方式在概念上。如果你有一個需要更新的bazillion行,那麼你可能需要嘗試一些不同的東西,例如創建一個臨時表並在你的UPDATE語句中使用JOIN或者使用行構造函數的子查詢。

8

您可以使用新數據創建一個臨時表(即id和weight是列),然後使用此數據更新表。

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; 

所以,你有一個create語句,一個INSERT語句,和一個更新語句。

0

存儲在批量插入一個臨時表中的記錄和刪除的TBL記錄,然後從臨時表做批量插入在TBL