2010-01-04 70 views
4

我需要更新表中的所有記錄(不應超過100條記錄)。每條記錄都需要用不同的值更新一個字段。MySQL:有沒有辦法在一個查詢中更新整個表?

我需要爲每個更新進行查詢還是有其他方法?我似乎無法一次搞定

感謝您的幫助!

編輯:爲了澄清,我正在更新的每個字段都將包含一個在客戶端確定的唯一值。所以沒有其他表參與。

+1

可能需要一些關於這一個的更多信息。你是否增加了領域,比如從3變爲4?所有行都獲得相同的「新」值嗎?你有一個包含新值和相應的主鍵(或其他字段)的數據集? – sberry 2010-01-04 23:57:54

回答

6

答案很大程度上取決於新值的來源。

如果你有新的價值觀的短名單,您可以使用CASE

UPDATE Table1 
SET column1 = CASE column1 
       WHEN 123 THEN ? 
       WHEN 456 THEN ? 
       ELSE ? 
       END; 

這是不實際的,如果新的值列表很長。

如果您需要與存在於另一個表中的相關行的值更新您的行,你可以使用MySQL的多表UPDATE語法:

UPDATE Table1 JOIN Table2 ON (Table1.pk = Table2.fk) 
SET Table1.column1 = Table2.column2; 

你也可以做一個相關子查詢類似的東西。

UPDATE Table1 SET column1 = (SELECT column2 FROM Table2 WHERE Table2.fk = Table1.pk); 

很久很久以前,當我使用MySQL的3.23(之前它支持多表更新或子查詢),我會運行一個SELECT的輸出被完全形成UPDATE語句。把所有的引號正確都很棘手,但結果是一個包含數百個單獨的UPDATE語句的SQL腳本,每個語句都在一行中改變值。效率不高,但如果只需要不經常進行,就沒有問題。

SELECT CONCAT(
    'UPDATE Table1 SET column1 = ', QUOTE(Table2.column2), 
    ' WHERE pk = ', Table2.fk, ';') AS SQL_statement 
FROM Table2; 
+0

感謝您的幫助!我試過你的更新情況查詢,但我沒有得到它的工作。我得到這個錯誤: #1064 - 你的SQL語法有錯誤;檢查對應於您的MySQL服務器版本的手冊,在第1行'CASE'附近使用正確的語法。 UPDATE Table1 SET column1 = CASE column2 WHEN 123 THEN 7 WHEN 456 56 ELSE 0 END CASE; – user239237 2010-01-05 13:38:18

+0

對不起,我忘記了MySQL語法結束時的表達式只是'END',而在其他RDBMS中他們更喜歡'END CASE'。我編輯了上面的例子。 – 2010-01-05 15:40:14

0

不知道你將分配給每一行的值,答案是「可能不是」。另一張海報提到,通過關閉WHERE子句,您可以同時影響所有行,但如果每行都需要自己的值,則不會對您有所幫助。

如果您可以提供一些關於如何知道給每行賦予什麼值的信息,可能會有更好的答案。等待更多信息...

0

如果更新的值與要記錄的記錄不同,則每次都需要創建新的UPDATE語句。

+0

這不完全正確。如果您希望更新的數據存在於另一個表中,則可以使用一個更新語句。 – 2010-01-05 00:00:10

+0

哦沒有想到 – antpaw 2010-01-05 00:03:30

0

如果每行的新值可以從行的當前值中推導出來,那麼可以在單個UPDATE查詢中完成。否則,不。

的一種方法是經常改變的列存儲在一個單獨的表,DELETETRUNCATE該表,並INSERT都在一個查詢中的新的值(通過使用多行插入查詢)。

在MySQL中,您可以訪問ON DUPLICATE KEY UPDATE來改進第一種方法。

0

如果每個值從其他值行中得到的,並且可以在一個簡單的公式來計算,你可以做這樣的事情:

UPDATE table_name SET col1 = (col2/col3); 

但是如果你的新值計算的數據庫之外(例如通過腳本),您可能無法做到比單獨的每行更新查詢更好。

0

如果每個字段都需要不同的值,

您可以將值存儲在數組中,並且可以編寫一個循環來完成它,因此您無需手動編寫每個UPDATE。

$myIds = array('1', '2', '3'); 
$myField = array('something', 'something2', 'something3'); 

for($i=0; $i<count($myIds); $i++){ 
    mysql_query("UPDATE table SET field = '{$myField[$i]}' WHERE id = '{$myIds[$i]}'); 
} 

你甚至可以通過SELECT語句創建$ myIds和$ MyField的陣列,根據您的需要,這將使它相當容易。

如果是用戶輸入,請務必清理這些變量。

相關問題