Mysql
 sql >> Database >  >> RDS >> Mysql

Posso utilizzare SU AGGIORNAMENTO CHIAVE DUPLICATA con una query INSERT utilizzando l'opzione SET?

Ho usato ON DUPLICATE KEY UPDATE Un sacco. Per alcune situazioni vale davvero la pena usare un'estensione SQL non standard.

Innanzitutto, devi assicurarti di avere un vincolo chiave univoco in atto. Il ON DUPLICATE KEY UPDATE la funzione si attiva solo se si è verificata una violazione della chiave univoca.

Ecco un formato comunemente usato:

 $query = "INSERT INTO $table (column1, column2, column3)
 VALUES ('value-1', 'value-2', 'value-3')
 ON DUPLICATE KEY UPDATE
 column1 = values(column1),
 column2 = values(column2),
 column3 = values(column3);"

column1 = values(column1) significa "Aggiorna colonna1 con il valore che sarebbe stato inserito se la query non avesse raggiunto la violazione della chiave duplicata". In altre parole, significa semplicemente aggiornare la colonna 1 a come sarebbe stata se l'inserto avesse funzionato.

Guardando questo codice, non sembra corretto che tu stia aggiornando tutte e tre le colonne che stai cercando di inserire. Quale delle colonne ha un vincolo univoco su di essa?

EDIT:modifica in base al formato "SET" dell'istruzione di inserimento mysql in base alla domanda dell'OP.

Fondamentalmente per usare ON DUPLICATE KEY UPDATE , scrivi semplicemente l'istruzione di inserimento come faresti normalmente, ma aggiungi il ON DUPLICATE KEY UPDATE clausola attaccata alla fine. Credo che dovrebbe funzionare in questo modo:

INSERT INTO $table 
    set column1 = 'value-1',
        column2 = 'value-2',
        column3 = 'value-3'
ON DUPLICATE KEY UPDATE
    column1 = values(column1),
    column2 = values(column2),
    column3 = values(column3);

Ancora una volta, una delle colonne che stai inserendo deve avere un indice univoco (o una combinazione delle colonne). Ciò può essere dovuto al fatto che una di esse è la chiave primaria o alla presenza di un indice univoco sulla tabella.