Inserire più valori con una sola update Mysql?

E' possibile con una sola istruzione UPDATE aggiornare più valori delle colonne delle tabelle di database, ad es. io vorrei ottenere un comportamento del genere:

UPDATE table SET Col1 = 1 WHERE id = 1;
UPDATE table SET Col1 = 2 WHERE id = 2;
UPDATE table SET Col2 = 3 WHERE id = 3;
UPDATE table SET Col1 = 10 WHERE id = 4;
UPDATE table SET Col2 = 12 WHERE id = 4;

con una sola istruzione SQL anzichè multiple?

In Corso 1
MySql 28-05-2018 2 Risposte 1751 Visite 0
Guglielmo Adolpi

Guglielmo Adolpi

Autore di questa domanda

Risposte ( 2 approvate )

  1. Giorgio Borelli
    +1
    28-05-2018 11:11:05
    Rispondi

    Certo che è possibile farlo, la questione è vecchia e risaputa, in MySQl per aggiornare più dati contemporaneamente con una sola istruzione SQL anzichè l'UPDATE si usa l'INSERT... ON DUPLICATE KEY, ad es. in questo modo:

    INSERT INTO table (Col1,Col2,Col3) VALUES (1,1,1),(2,2,3),(3,9,3),(4,10,12)
    ON DUPLICATE KEY UPDATE Col1=VALUES(Col1),Col2=VALUES(Col2),Col3=VALUES(Col3);

    Il codice è di facile lettura ed interpretazione, spero ti possa essere utile.

  2. Giacomo Barrile
    0
    28-05-2018 11:28:14
    Rispondi

    Attenzione però che l'uso della INSERT ON DUPLICATE KEY come istruzione per l'aggiornamento dei dati può avere degli effetti collaterali indesiderati, bisogna precisare e ricordare che:

    • Nel caso che la chiave primaria (possibilmente composta anche da più di un campo) sia nulla verrà inserito un nuovo valore e magari non è questo il comportamento che desideravi ottenere.
    • Se hai impostato un campo come 'NOT NULL' e per questo non è previsto un valore di default, anche in questo caso il valore sarà aggiornato, ed ancora una volta magari non era il comportamento desiderato.

    Usare la INSERT ON DUPLICATE KEY per fare un'UPDATE di valori multipli può essere una valida soluzione, ma bisogna essere consapevoli di quello che si sta facendo se non si vogliono avere degli effetti indesiderati, in altri termini si potrebbe usare una variante di questa inserendo le istruzioni 'case / when / then' per controllare le condizioni di applicabilità ad ogni singolo record; inoltre questa variante sebbene l'istruzione sql sia più complessa da scrivere essa risulta due volte più veloce della precedente.

    Infine si può aggiungere che è possibile ottenere aggiornamenti multipli dei valori dei records usando le transazioni (TRANSACTION).

Rispondi

Per poter rispondere a questa domanda, devi essere registrato e loggato sul sito, dopodichè compila il box sottostante cercando di essere il più chiaro ed esauriente possibile, la tua risposta potrebbe essere la soluzione che l'utente cerca ed essere contrassegnata come migliore, consentendoti così di ottenere punti ed autorevolezza.

 Domanda Precedente

 Elenco Domande 

Domanda Successiva