2012-06-20 33 views
0

我有一個文本文件,其中包含例如公司名稱,產品和價格。在數據庫中有大約200條記錄,而在文本文件中有更多。現在我想通過一個sql查詢更新所有的價格。我曾經嘗試這樣做:用PHP在MySQL中一次更新多行

for($i = $start_row; $i < $stop_row; $i += 3) 
... 
$prices = array($price1, $price2, price3); 
$pricesfloat = array_map('floatval', $prices); 
... 
$query = "UPDATE test3 SET price1 = $pricesfloat[0], price2 = $pricesfloat[1], price3 = $pricesfloat[2] WHERE company = '$company' AND product = '$product'"; 
mysql_query($query, $connection) or die(mysql_error()); 

mysql_affected_rows()返回0行。我可以用INSERT INTO將所有值插入到db中,但在這種情況下,我必須更新現有值並稍後添加缺少的值。有人可以幫忙嗎? :)

+0

注意mysql_affected_rows可能會返回0,即使更新成功。這是舊值和新值相同的時候。 –

+0

也許REPLACE sql-query可以幫到你嗎? – odiszapc

+0

如果我沒有記錯,'REPLACE'語句不支持'WHERE' – user1108483

回答

0

INSERT ... ON DUPLICATE KEY UPDATEhttp://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html,可能適合你的情況:

INSERT INTO table (product_id, price) VALUES (1, 1.323),(2, 3434) ... (200, 2.333) ON DUPLICATE KEY UPDATE price = VALUES(price) 

批量更新的另一種方式是:

UPDATE table 
INNER JOIN (
    (SELECT 'company1' AS company, 'product1' AS product, 'price1' AS price 
    UNION ALL SELECT 'company2', 'product2', 'price2' 
    .... 
    UNION ALL SELECT 'companyN', 'productN', 'priceN') AS tmp 
) USING (company, product) 
SET table.price = tmp.price 
+0

我不確定我可以得到那個工作,因爲數據庫沒有產品和公司的ID,每行只有一個ID。計劃是匹配的行必須有更新,如果沒有添加數據,php腳本會詢問用戶如果找不到匹配項,該怎麼做。 – user1108483

+0

您可以在(公司,產品)上添加唯一索引以產生重複衝突。或者使用工會生成的派生表,使用棘手的更新:) – vearutop

+0

我試圖給公司添加唯一索引,但是我得到'重複輸入錯誤'消息。我應該使用記錄ID做些什麼?當然是主要關鍵...... – user1108483