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 realizzare ciò che ci si aspetta usando le funzionalità esistenti.
Esistono 3 possibili soluzioni: utilizzare INSERT IGNORE, REPLACE o INSERT ... AL DUPLICATE KEY UPDATE.
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 metadati di trascrizioni da Ensembl e che per vari motivi la pipeline potrebbe essere rotta in qualsiasi fase dell'esecuzione. Pertanto, dobbiamo garantire due cose:
ripetute esecuzioni della pipeline non distruggeranno il nostro database
esecuzioni ripetute non moriranno a causa di errori di "chiave primaria duplicata".
Metodo 1: usare 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 è efficace nel nostro caso: non è necessario sovrascrivere i record esistenti, va bene solo saltarli.
Metodo 2: usare 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à silenziosamente ignorato (ignorato). (Per essere più precisi, ecco una citazione dal manuale di riferimento di MySQL: "Se si utilizza la parola chiave IGNORE, gli errori che si verificano durante l'esecuzione dell'istruzione INSERT vengono trattati come avvisi. Ad esempio, senza IGNORE, una riga che duplica un indice UNIQUE esistente o il valore PRIMARY KEY nella tabella provoca un errore di chiave duplicata e l'istruzione viene interrotta. ”. Se il record non esiste ancora, verrà creato.
Questo secondo metodo presenta diversi potenziali punti deboli, incluso il mancato aborto della query nel caso in cui si verifichino altri problemi (consultare il manuale). Quindi dovrebbe essere usato se precedentemente testato senza la parola chiave IGNORE.
Metodo 3: utilizzo di INSERT… ON DUPLICATE KEY UPDATE:
La terza opzione è quella di utilizzare la INSERT … ON DUPLICATE KEY UPDATE
sintassi e nella parte UPDATE semplicemente non fare alcuna operazione insignificante (vuota), come il calcolo di 0 + 0 (Geoffray suggerisce di fare l'assegnazione id = id per il motore di ottimizzazione di MySQL per ignorare questa operazione). Il vantaggio di questo metodo è che ignora solo eventi chiave duplicati e si interrompe ancora su altri errori.
Come ultimo avviso: questo post è stato ispirato da Xaprb. Consiglierei anche di consultare l'altro suo post sulla scrittura di query SQL flessibili.