2013-11-27 38 views
76

我有表 - config。 架構: config_name | config_valueSQL - 在一個查詢中更新多個記錄

我想在一個查詢中更新多個記錄。我嘗試這樣的:

UPDATE config 
SET t1.config_value = 'value' 
    , t2.config_value = 'value2' 
WHERE t1.config_name = 'name1' 
    AND t2.config_name = 'name2'; 

但該查詢是錯誤的:(

你能幫我

+1

你使用了哪個數據庫? –

+0

我正在使用MySQL數據庫。 – user3022527

+0

從選擇更新可能是答案http://stackoverflow.com/questions/2334712/update-from-select-using-sql-server –

回答

88

嘗試或者多表更新語法

UPDATE config t1 JOIN config t2 
    ON t1.config_name = 'name1' AND t2.config_name = 'name2' 
    SET t1.config_value = 'value', 
     t2.config_value = 'value2'; 

這裏是SQLFiddle demo

or condit有理更新

UPDATE config 
    SET config_value = CASE config_name 
         WHEN 'name1' THEN 'value' 
         WHEN 'name2' THEN 'value2' 
         ELSE config_value 
         END 
WHERE config_name IN('name1', 'name2'); 

這裏是SQLFiddle演示

+0

是的,這很好,但當我wolud喜歡更新一個查詢中的16條記錄?我sholud使用JOIN x 16? – user3022527

+8

你**應該首先在你的問題中提及這些重要的細節。無論如何,看到更多的解決方案(有條件更新)的答案。 – peterm

+1

選項2非常好。謝謝 ! – user3022527

75

你可以用INSERT如下完成它:

INSERT INTO mytable (id, a, b, c) 
VALUES (1, 'a1', 'b1', 'c1'), 
(2, 'a2', 'b2', 'c2'), 
(3, 'a3', 'b3', 'c3'), 
(4, 'a4', 'b4', 'c4'), 
(5, 'a5', 'b5', 'c5'), 
(6, 'a6', 'b6', 'c6') 
ON DUPLICATE KEY UPDATE id=VALUES(id), 
a=VALUES(a), 
b=VALUES(b), 
c=VALUES(c); 

這將新值插入表中,但如果主鍵複製(已插入到表中),您指定的值將被更新,並且相同的記錄不會被第二次插入。

+13

一個相當聰明的黑客。我很驚訝。 – Blaise

+2

我在接近ON時出現語法錯誤。這裏 – arqam

+0

語法錯誤以及 – kevzettler

3
在我的情況

我要更新,而不是每個我寧願這一次擊球更新詢問這1000多個記錄,爲此,

UPDATE mst_users 
    SET base_id = CASE user_id 
    WHEN 78 THEN 999 
    WHEN 77 THEN 88 
    ELSE base_id END WHERE user_id IN(78, 77) 

78,77是用戶ID,併爲那些用戶ID我需要分別更新base_id 999和88.This適用於我。

2

執行下面的代碼,如果你要更新所有列的所有記錄:

update config set column1='value',column2='value'...columnN='value'; 

,如果你想更新特定行的所有列然後執行以下代碼:

update config set column1='value',column2='value'...columnN='value' where column1='value' 
3

也許有人會有用

for Postgresql 9.5作爲一個魅力

INSERT INTO tabelname(id, col2, col3, col4) 
VALUES 
    (1, 1, 1, 'text for col4'), 
    (DEFAULT,1,4,'another text for col4') 
ON CONFLICT (id) DO UPDATE SET 
    col2 = EXCLUDED.col2, 
    col3 = EXCLUDED.col3, 
    col4 = EXCLUDED.col4 

此SQL更新現有記錄並插入新的(2合一)

+0

正如我所看到的,id是爲您的查詢pk。假設有2個或更多的列被視爲PK(複合鍵)...在這種情況下應該是什麼樣的正確方法檢查衝突。 –

0

Camille的解決方案工作。把它變成一個基本的PHP函數,它寫出了SQL語句。希望這可以幫助別人。

function _bulk_sql_update_query($table, $array) 
    { 
     /* 
     * Example: 
     INSERT INTO mytable (id, a, b, c) 
     VALUES (1, 'a1', 'b1', 'c1'), 
     (2, 'a2', 'b2', 'c2'), 
     (3, 'a3', 'b3', 'c3'), 
     (4, 'a4', 'b4', 'c4'), 
     (5, 'a5', 'b5', 'c5'), 
     (6, 'a6', 'b6', 'c6') 
     ON DUPLICATE KEY UPDATE id=VALUES(id), 
     a=VALUES(a), 
     b=VALUES(b), 
     c=VALUES(c); 
    */ 
     $sql = ""; 

     $columns = array_keys($array[0]); 
     $columns_as_string = implode(', ', $columns); 

     $sql .= " 
     INSERT INTO $table 
     (" . $columns_as_string . ") 
     VALUES "; 

     $len = count($array); 
     foreach ($array as $index => $values) { 
      $sql .= '("'; 
      $sql .= implode('", "', $array[$index]) . "\""; 
      $sql .= ')'; 
      $sql .= ($index == $len - 1) ? "" : ", \n"; 
     } 

     $sql .= "\nON DUPLICATE KEY UPDATE \n"; 

     $len = count($columns); 
     foreach ($columns as $index => $column) { 

      $sql .= "$column=VALUES($column)"; 
      $sql .= ($index == $len - 1) ? "" : ", \n"; 
     } 

     $sql .= ";"; 

     return $sql; 
    } 
相關問題