INSERT if not exists. Torna molto comoda se vogliamo inserire dati in una tabella che non siano già presenti al 100% e in questo articolo vediamo come eseguirla in MySQL.
Immaginiamo di trovarci nel caso in cui abbiamo una tabella con milioni di righe.
Sappiamo come sono formati i dati, sappiamo come sono strutturati, ma vogliamo essere sicuri al 100% che se dovessimo inserirne di nuovi non ci siano poi dei cloni nella nostra tabella.
Come fare quindi?
Ciao mi chiamo Lorenzo Neri e sono un informatico: realizzo contenuti per aiutare le persone a padroneggiare l’arte del nuovo millennio, ovvero l’informatica!
Usare unique
Il vincolo “unique” torna molto comodo in certi casi, ma non nel nostro!
Il motivo è molto semplice: non agisce a livello di riga intera, ma a livello di campi.
Questo significa che tutte le colonne delle righe devono avere questo vincolo.
Ma allora come diavolo fare per eseguire questa “INSERT if not exists”?
REPLACE
Partendo da una tabella già piena come dicevamo all’inizio:
REPLACE INTO nomeDellaTabella
SET colonna1 = valore1,
colonna2 = valore2;
Cosa succede con la replace?
Semplicemente, se esiste una riga con i medesimi valori viene sovrascritta, se non esiste viene creata.
Tuttavia non è proprio ottimale per eseguire l’equivalente della “INSERT if not exists” perchè non abbiamo bisogno di eseguire una sovrascrittura dei record, ma è giusto vederlo.
Andiamo oltre.
INSERT IGNORE
Qui vediamo finalmente come eseguire in MySQL l’equivalente vero e proprio della “INSERT if not exists”.
Molto molto semplice, come prima:
INSERT IGNORE INTO nomeDellaTabella
SET colonna1 = valore1,
colonna2 = valore2;
Cosa succede di diverso qui?
Questa volta, se esiste una riga con quei valori, la parte di query dove chiediamo di inserirlo nuovamente viene ignorata e passa all’eventuale riga successiva da inserire.
Facile, rapido e indolore vero? Ora che abbiamo capito come eseguire in MySQL un… “Alternativa” della “INSERT if not exists” ci sono da fare alcune precisazioni.
I problemi che può causare la “INSERT IGNORE”
Se durante il processo di inserimento stiamo accidentalmente eseguendo la duplicazione di una chiave primaria, oppure un termine con il vincolo “unique” verrà generato un warning!
Non solo.
Purtroppo, stando a ciò che dice il manuale, se la query ha altri problemi durante l’esecuzione questa non viene interrotta ed è veramente un gran problema.
Motivo per cui, se fossi titubante su usare questo secondo metodo, ti invito a guardare questo punto del manuale di MySQL.