我需要更新表中的所有記錄(不應超過100條記錄)。每條記錄都需要用不同的值更新一個字段。MySQL:有沒有辦法在一個查詢中更新整個表?
我需要爲每個更新進行查詢還是有其他方法?我似乎無法一次搞定
感謝您的幫助!
編輯:爲了澄清,我正在更新的每個字段都將包含一個在客戶端確定的唯一值。所以沒有其他表參與。
我需要更新表中的所有記錄(不應超過100條記錄)。每條記錄都需要用不同的值更新一個字段。MySQL:有沒有辦法在一個查詢中更新整個表?
我需要爲每個更新進行查詢還是有其他方法?我似乎無法一次搞定
感謝您的幫助!
編輯:爲了澄清,我正在更新的每個字段都將包含一個在客戶端確定的唯一值。所以沒有其他表參與。
答案很大程度上取決於新值的來源。
如果你有新的價值觀的短名單,您可以使用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;
感謝您的幫助!我試過你的更新情況查詢,但我沒有得到它的工作。我得到這個錯誤: #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
對不起,我忘記了MySQL語法結束時的表達式只是'END',而在其他RDBMS中他們更喜歡'END CASE'。我編輯了上面的例子。 – 2010-01-05 15:40:14
不知道你將分配給每一行的值,答案是「可能不是」。另一張海報提到,通過關閉WHERE子句,您可以同時影響所有行,但如果每行都需要自己的值,則不會對您有所幫助。
如果您可以提供一些關於如何知道給每行賦予什麼值的信息,可能會有更好的答案。等待更多信息...
如果更新的值與要記錄的記錄不同,則每次都需要創建新的UPDATE語句。
這不完全正確。如果您希望更新的數據存在於另一個表中,則可以使用一個更新語句。 – 2010-01-05 00:00:10
哦沒有想到 – antpaw 2010-01-05 00:03:30
如果每行的新值可以從行的當前值中推導出來,那麼可以在單個UPDATE
查詢中完成。否則,不。
的一種方法是經常改變的列存儲在一個單獨的表,DELETE
或TRUNCATE
該表,並INSERT
都在一個查詢中的新的值(通過使用多行插入查詢)。
在MySQL中,您可以訪問ON DUPLICATE KEY UPDATE
來改進第一種方法。
如果每個值從其他值行中得到的,並且可以在一個簡單的公式來計算,你可以做這樣的事情:
UPDATE table_name SET col1 = (col2/col3);
但是如果你的新值計算的數據庫之外(例如通過腳本),您可能無法做到比單獨的每行更新查詢更好。
如果每個字段都需要不同的值,
您可以將值存儲在數組中,並且可以編寫一個循環來完成它,因此您無需手動編寫每個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的陣列,根據您的需要,這將使它相當容易。
如果是用戶輸入,請務必清理這些變量。
可能需要一些關於這一個的更多信息。你是否增加了領域,比如從3變爲4?所有行都獲得相同的「新」值嗎?你有一個包含新值和相應的主鍵(或其他字段)的數據集? – sberry 2010-01-04 23:57:54