SQL: aggiorna più record in una query


132

Ho table - config . Schema: config_name | config_value

E vorrei aggiornare più record in una query. Ci provo così:

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

ma quella query è sbagliata :(

Mi potete aiutare?


1
che database stai usando?
Hart CO,

Sto usando il database MySQL.
user3022527

L'aggiornamento da Select potrebbe essere la risposta stackoverflow.com/questions/2334712/…
Jonathan Benn,

Risposte:


167

Prova una sintassi di aggiornamento su più tabelle

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

Ecco la demo di SQLFiddle

o aggiornamento condizionale

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

Ecco la demo di SQLFiddle


1
Sì, va bene, ma cosa succede quando vorrei aggiornare 16 record in una query? Devo usare JOIN x 16?
user3022527

19
Si dovrebbe parlare di questi dettagli importanti nella tua domanda, in primo luogo. Comunque vedi la risposta aggiornata per un'altra soluzione (aggiornamento condizionale).
peterm,

1
Cosa sono t1 e t2 nei tuoi esempi?
Paul Brewczynski,

1
Ciao anche a te @PaulBrewczynski. Questi sono alias di tabella e possono essere scritti config AS t1dove ASè facoltativo.
peterm

@peterm: i collegamenti SQLFiddle sono interrotti. Altrimenti, la tecnica di aggiornamento condizionale funziona alla grande. Grazie!
Jonathan Benn,

142

Puoi realizzarlo con INSERT come di seguito:

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

Ciò inserisce nuovi valori nella tabella, ma se la chiave primaria viene duplicata (già inserita nella tabella), i valori specificati verranno aggiornati e lo stesso record non verrà inserito la seconda volta.


26
un trucco piuttosto intelligente. Sono stupito.
Blaise

6
Non supportato per Postgres vedere: stackoverflow.com/questions/1109061/...
kevzettler

Inoltre, è un ottimo modo per trasformare un po 'di CSV (o molto) in una tabella di inserimento / aggiornamento / aggiornamento con alcune modifiche di testo minori!
Wulftone,

6
Questa è una soluzione MySQL, non Postgres o MSSQL.
Rz Mk,

1
Ciò aumenterà l'id di incremento automatico, anche se il record non è inserito o aggiornato
Timo Huovinen,

15

nel mio caso devo aggiornare i record che sono più di 1000, per questo invece di colpire la query di aggiornamento ogni volta che ho preferito questo,

   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 sono gli ID utente e per quegli ID utente ho bisogno di aggiornare rispettivamente base_id 999 e 88. Questo funziona per me.


Uno dei migliori qui, ha funzionato alla grande per me.
Shahrukh Anwar,

7

forse per qualcuno sarà utile

per Postgresql 9.5 funziona come un fascino

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

questo SQL aggiorna il record esistente e inserisce se nuovo (2 in 1)


1
Come posso vedere, id è pk per la tabella secondo la tua query. Supponi che ci siano 2 o più colonne considerate come pk (chiave composita) ... In quel caso quale dovrebbe essere il modo corretto di controllare il conflitto.
Sritam Jagadev,

6

La soluzione di Camille ha funzionato. Trasformato in una funzione PHP di base, che scrive l'istruzione SQL. Spero che questo aiuti qualcun altro.

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

5

Invece di questo

UPDATE staff SET salary = 1200 WHERE name = 'Bob';
UPDATE staff SET salary = 1200 WHERE name = 'Jane';
UPDATE staff SET salary = 1200 WHERE name = 'Frank';
UPDATE staff SET salary = 1200 WHERE name = 'Susan';
UPDATE staff SET salary = 1200 WHERE name = 'John';

Puoi usare

UPDATE staff SET salary = 1200 WHERE name IN ('Bob', 'Frank', 'John');

3

Esegui il codice seguente per aggiornare n numero di righe, dove ID padre è l'id da cui vuoi ottenere i dati e gli ID figlio sono gli ID che devi aggiornare, quindi devi solo aggiungere l'id padre e gli ID figlio per aggiornare tutte le righe necessarie usando un piccolo script.

    UPDATE [Table]
 SET couloumn1= (select couloumn1 FROM Table WHERE IDCouloumn = [PArent ID]),
     couloumn2= (select couloumn2 FROM Table WHERE IDCouloumn = [PArent ID]),
     couloumn3= (select couloumn3 FROM Table WHERE IDCouloumn = [PArent ID]),
     couloumn4= (select couloumn4 FROM Table WHERE IDCouloumn = [PArent ID]),
 WHERE IDCouloumn IN ([List of child Ids])

2

Supponendo che tu abbia l'elenco di valori da aggiornare in un foglio di calcolo Excel con valore_config nella colonna A1 e nome_config in B1 , puoi facilmente scrivere la query lì usando una formula di Excel come

=CONCAT("UPDATE config SET config_value = ","'",A1,"'", " WHERE config_name = ","'",B1,"'")


1

Eseguire il codice seguente se si desidera aggiornare tutti i record in tutte le colonne:

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

e se vuoi aggiornare tutte le colonne di una particolare riga, esegui il codice seguente:

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

3
cosa succede se un valore diverso in una riga diversa? per esempio AGGIORNAMENTO personale SET stipendio = 1125 DOVE nome = 'Bob'; AGGIORNAMENTO personale SET stipendio = 1200 DOVE nome = 'Jane'; AGGIORNAMENTO personale SET stipendio = 1100 DOVE nome = "Frank"; AGGIORNAMENTO personale SET stipendio = 1175 DOVE nome = "Susan"; AGGIORNAMENTO personale SET stipendio = 1150 DOVE nome = "Giovanni";
Abdullah Nurum,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.