Le chiavi primarie della tabella MySQL e gli indici univoci impediscono che più righe con lo stesso indice vengano aggiunte alla tabella. Se si tenta di inserire una riga duplicata con un'istruzione INSERT standard, si verificherà un errore e l'inserimento avrà esito negativo.
MySQL fornisce diverse alternative all'istruzione INSERT standard e ciascuna gestisce le righe duplicate in modo leggermente diverso: "INSERT IGNORE", "INSERT ... ON DUPLICATE KEY UPDATE" e "REPLACE".
Chiavi primarie e indici univoci
Gli indici di chiave primaria e i vincoli di indice "UNIQUE" richiedono che ogni riga contenga un valore univoco nelle colonne dell'indice, consentendo a ciascuna riga di essere identificata dalla relativa chiave primaria o dal valore nelle colonne dei vincoli di indice UNIQUE.
Se un normale INSERT tenta di inserire una riga che contiene un valore duplicato nella chiave primaria o nell'indice di vincolo UNIQUE, l'inserimento avrà esito negativo, probabilmente ripristinando l'intera transazione.
INSERISCI IGNORA
INSERT IGNORE inserirà le righe nello stesso modo di INSERT, ma con l'eccezione che ignorerà le righe con valori duplicati e continuerà l'esecuzione senza creare un errore. Qualsiasi riga che contiene un valore duplicato non verrà inserita; per esempio:
INSERT IGNORE INTO my_table (unique_index_column, other_column) VALUES (1, 'other value');
INSERISCI ... SU DUPLICATO AGGIORNAMENTO CHIAVE
INSERT ... ON DUPLICATE KEY UPDATE inserirà tutte le righe non duplicate come di consueto. Tuttavia, quando incontra una riga duplicata, eseguirà un AGGIORNAMENTO sulla riga originale; per esempio:
INSERT INTO my_table (unique_index_column, other_column) VALUES (1, 'other value') ON DUPLICATE KEY UPDATE other_column = 'duplicate update value';
SOSTITUIRE
REPLACE funziona come INSERT, tranne per il fatto che quando incontra una riga duplicata, elimina la riga originale e quindi continua con l'inserimento. Qualsiasi riga con un valore di indice univoco duplicato sostituirà la riga che originariamente conteneva il valore; per esempio:
REPLACE INTO my_table (unique_index_column, other_column) VALUES (1, 'other value')