2013-11-27 15 views
76

Mam tabelę - config. Schemat: config_name | config_valueSQL - Zaktualizuj wiele rekordów w jednym zapytaniu

Chciałbym zaktualizować wiele rekordów w jednym zapytaniu. Staram się tak:

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

jednak, że zapytanie jest źle :(

Pomożesz mi

+1

Jaką bazę danych używasz? –

+0

Używam bazy danych MySQL. – user3022527

+0

Aktualizacja z Select może być odpowiedzią http://stackoverflow.com/questions/2334712/update-from-select-using-sql-server –

Odpowiedz

88

Spróbuj albo multi-table zmiana składni

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'; 

Oto SQLFiddle? demo

lub warunek ional aktualizacja

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'); 

Oto SQLFiddle demo

+0

Tak, w porządku, ale co, gdy wolę zaktualizować 16 rekordów w jednym zapytaniu? Używam JOIN x 16? – user3022527

+8

Ty ** powinieneś ** wspomnieć o tak ważnych szczegółach w pytaniu. W każdym razie zobacz zaktualizowaną odpowiedź na inne rozwiązanie (aktualizacja warunkowa). – peterm

+1

opcja 2 jest bardzo dobra. DZIĘKI ! – user3022527

75

można wykonać go z INSERT jak poniżej:

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); 

wstawienie nowych wartości w tabeli, ale jeśli klucz podstawowy jest powielany (już wstawiony do tabeli), że podane wartości zostaną zaktualizowane i ten sam rekord nie zostanie wstawiony po raz drugi.

+13

całkiem sprytny hack. Jestem zdumiony. – Blaise

+2

Otrzymuję komunikat o błędzie składni w pobliżu ON. – arqam

+0

Błąd składniowy tutaj również – kevzettler

3

w moim przypadku muszę aktualizować rekordy, które mają więcej niż 1000, bo to zamiast uderzania kwerenda aktualizująca każdym razem wolałem to,

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 są identyfikatorów użytkowników i dla tych, identyfikator użytkownika Potrzebuję zaktualizować odpowiednio base_id 999 i 88. To działa dla mnie.

2

Wykonaj poniższy kod, jeśli chcesz zaktualizować rekord we wszystkich kolumnach:

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

i jeśli chcesz zaktualizować wszystkie kolumny danego rzędu następnie wykonać poniższy kod:

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

może ktoś będzie przydatna

dla PostgreSQL 9.5 działa jak czar

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 

to aktualizacja istniejącego rekordu SQL i wstawienie nowego (2 w jednym)

+0

Jak widzę, id to pk dla tabeli jak na twoje zapytanie. Zależy, że są 2 lub więcej kolumn uważanych za pk (klucz złożony) ... W takim przypadku jaki powinien być właściwy sposób sprawdzić konflikt. –

0

Rozwiązanie Camille zadziałało. Przekształcił go w podstawową funkcję PHP, która zapisuje instrukcję SQL. Mam nadzieję, że to pomoże komuś innemu.

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; 
    } 
Powiązane problemy