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

Come posso fare "inserire se non esiste" in MySQL?

Usa INSERT IGNORE INTO table .

C'è anche INSERT … ON DUPLICATE KEY UPDATE sintassi e puoi trovare spiegazioni in 13.2.6.2 INSERT... ON DUPLICATE KEY UPDATE Statement .

Post da bogdan.org.ua secondo Webcache di Google :

18 ottobre 2007

Per iniziare:a partire dall'ultimo MySQL, la sintassi presentata nel titolo non è possibile. Ma ci sono molti modi molto semplici per ottenere ciò che ci si aspetta utilizzando le funzionalità esistenti.

Ci sono 3 possibili soluzioni:usando INSERT IGNORE, REPLACE, oINSERT … SU AGGIORNAMENTO DUPLICATO CHIAVE.

Immagina di avere un tavolo:

CREATE TABLE `transcripts` (
`ensembl_transcript_id` varchar(20) NOT NULL,
`transcript_chrom_start` int(10) unsigned NOT NULL,
`transcript_chrom_end` int(10) unsigned NOT NULL,
PRIMARY KEY (`ensembl_transcript_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Ora immagina di avere una pipeline automatica che importa i metadati delle trascrizioni da Ensembl e che per vari motivi la pipeline potrebbe essere interrotta in qualsiasi fase dell'esecuzione. Quindi, dobbiamo garantire due cose:

  1. Le ripetute esecuzioni della pipeline non distruggeranno il nostro> database
  1. Le esecuzioni ripetute non moriranno a causa di errori di "duplicazione della chiave primaria".

Metodo 1:utilizzo di REPLACE

È molto semplice:

REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;

Se il record esiste, verrà sovrascritto; se non esiste ancora, verrà creato. Tuttavia, l'utilizzo di questo metodo non è efficiente nel nostro caso:non è necessario sovrascrivere i record esistenti, va bene solo saltarli.

Metodo 2:utilizzando INSERT IGNORE Anche molto semplice:

INSERT IGNORE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;

Qui, se 'ensembl_transcript_id' è già presente nel database, verrà ignorato silenziosamente (ignorato). (Per essere più precisi, ecco una citazione dal manuale di riferimento di MySQL:"Se usi la parola chiave IGNORE, gli errori che si verificano durante l'esecuzione dell'istruzione INSERT vengono invece trattati come avvisi. Ad esempio, senza IGNORE, una riga che duplica un indice UNIQUE esistente o una CHIAVE PRIMARIA valore nella tabella provoca un errore di chiave duplicata e l'istruzione viene interrotta.”.) Se il record non esiste ancora, verrà creato.

Questo secondo metodo ha diversi potenziali punti deboli, incluso il mancato aborto della query nel caso si verifichino altri problemi (vedi il manuale). Pertanto dovrebbe essere utilizzato se precedentemente testato senza la parola chiave IGNORE.

Metodo 3:utilizzando INSERT … SU AGGIORNAMENTO DUPLICATO CHIAVE:

La terza opzione è usare INSERT … ON DUPLICATE KEY UPDATE sintassi, e nella parte UPDATE semplicemente non fare nulla per eseguire operazioni senza senso (vuote), come calcolare 0+0 (Geoffray suggerisce di eseguire l'assegnazione theid=id affinché il motore di ottimizzazione MySQL ignori questa operazione). Il vantaggio di questo metodo è che ignora solo gli eventi duplicatekey e si interrompe comunque in caso di altri errori.

Come avviso finale:questo post è stato ispirato da Xaprb. Consiglierei anche di consultare il suo altro post sulla scrittura di query SQL flessibili.