Inserisci una riga se non esiste in MySQL

Rayven Esplanada 30 gennaio 2023
  1. Usa REPLACE per inserire se non esiste in MySQL
  2. Usa INSERT IGNORE per inserire se non esiste in MySQL
  3. Usa INSERT ... ON DUPLICATE KEY UPDATE per inserire se non esiste in MySQL
Inserisci una riga se non esiste in MySQL

Questo tutorial mostra come inserire una riga in una tabella se non esiste ancora in mySQL.

Ci sono tre semplici modi per risolvere questo problema, usando REPLACE, INSERT IGNORE, o INSERT ... ON DUPLICATE KEY UPDATE.

Per prima cosa, immaginiamo di avere una tabella person strutturata come tale:

CREATE TABLE person (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT NOT NULL,
address VARCHAR(128) 
);

Con i seguenti record esistenti:

id name age address
1 John Doe 27 New York, New York
2 Jane Doe 26 Berlin, Germany
3 Chun Li 24 Beijing, China
4 Thor Odinson 40 Asgard

Ora passiamo alle soluzioni effettive.

Usa REPLACE per inserire se non esiste in MySQL

Quello che fa REPLACE è che sovrascrive i record esistenti quando vengono trovati; se non esiste ancora, inserirà una nuova riga. È essenzialmente come UPDATE ma con funzionalità INSERT.

Forniamo una query di esempio per eseguire REPLACE in John Doe.

REPLACE INTO 'person'
SET id = 1,
name = 'John Doe'`,
age = 28,
address = 'Los Angeles, California'

Se John Doe esiste, verrà sovrascritto con i nuovi dati; se non lo fa, creerà una nuova voce per John Doe.

Tuttavia, questo metodo non è efficiente per l’inserimento in quanto sovrascrive i record esistenti invece di saltarli semplicemente se viene trovato. Sebbene porti a termine il lavoro, non è il modo migliore per farlo.

Il nuovo risultato quando la query seleziona John Doe sarà come tale:

id name age address
1 John Doe 28 Los Angeles, California

L’età e l’indirizzo di John Doe sono stati modificati o aggiornati dallo script REPLACE.

Usa INSERT IGNORE per inserire se non esiste in MySQL

Useremo gli stessi dati non modificati nella tabella sopra anche per questo.

Su INSERT IGNORE, se la chiave primaria del record è già presente nel database, verrà silenziosamente ignorata o saltata.

Se togliamo la parola chiave IGNORE, l’inserimento di un record con un id o una chiave primaria esistente interromperà la query e mostrerà un messaggio di errore che dice che il record con la chiave primaria esiste già.

Dopo l’INSERT, l’IGNORE sostituisce l’aborto a causa dell’errore, e invece si limita a continuare la ricerca pur non inserendo un nuovo record.

INSERT IGNORE person
SET 'id' = 4,
age = 1000,
address = 'Chicago'

In base alla tabella che abbiamo dichiarato sopra, esiste già un record con un id o una chiave primaria 4 (Thor Odinson). Pertanto, questa query viene ignorata dallo script e quindi non aggiorna o inserisce un record nel database.

Il risultato se interroghiamo Thor in person sarebbe:

id name age address
4 Thor Odinson 40 Asgard

L’età e l’indirizzo nella query non hanno influenzato affatto la riga con id 4.

Usa INSERT ... ON DUPLICATE KEY UPDATE per inserire se non esiste in MySQL

Se usi la clausola ON DUPLICATE KEY UPDATE e la riga che vuoi inserire sarebbe un duplicato in un indice UNIQUE o chiave primaria, la riga eseguirà un UPDATE.

Questo essenzialmente fa la stessa cosa che fa REPLACE.

Diciamo che vogliamo inserire un record con id 2

INSERT INTO person (id, name, age, address)
VALUES (1, 'Jane Deer', '33', 'Tallahassee Florida')
ON DUPLICATE KEY UPDATE id = id+1;

L ‘id viene incrementato per generare un nuovo record invece di aggiornare quello esistente.

Se interroghiamo tutte le righe di person, il risultato sarebbe questo:

id name age address
1 John Doe 27 New York, New York
2 Jane Doe 26 Berlin, Germany
3 Chun Li 24 Beijing, China
4 Thor Odinson 40 Asgard
5 Jane Deer 33 Tallahasee, Florida

Jane Deer, invece di sostituire Jane Doe, viene aggiunto come nuovo record nella tabella.

Il modo più efficiente per gestire l’inserimento e il controllo della sua esistenza è sicuramente quello di utilizzare INSERT IGNORE.

Tuttavia, le altre due parole chiave sono utilizzabili anche caso per caso, se vuoi aggiornare se esiste una riga che vuoi inserire, usa REPLACE. Se non vuoi che la riga venga modificata ma vuoi veramente inserire il nuovo record, usa INSERT ... ON DUPLICATE KEY UPDATE.

Rayven Esplanada avatar Rayven Esplanada avatar

Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.

LinkedIn