18 de octubre de 2007
Para comenzar: a partir de la última versión de MySQL, la sintaxis presentada en el título no es posible. Pero hay varias maneras muy fáciles de lograr lo que se espera usando la funcionalidad existente.
Hay 3 soluciones posibles: usar INSERT IGNORE, REPLACE o INSERT ... ON DUPLICATE KEY UPDATE.
Imagina que tenemos una mesa:
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;
Ahora imagine que tenemos una tubería automática que importa metadatos de transcripciones de Ensembl, y que debido a varias razones, la tubería puede romperse en cualquier paso de la ejecución. Por lo tanto, debemos garantizar dos cosas:
ejecuciones repetidas de la tubería no destruirán nuestra base de datos
las ejecuciones repetidas no morirán debido a errores de "clave principal duplicada".
Método 1: usando REPLACE
Es muy simple:
REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
Si el registro existe, se sobrescribirá; si aún no existe, se creará. Sin embargo, el uso de este método no es eficiente para nuestro caso: no necesitamos sobrescribir los registros existentes, está bien solo omitirlos.
Método 2: usando INSERT IGNORE También muy simple:
INSERT IGNORE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
Aquí, si el 'ensembl_transcript_id' ya está presente en la base de datos, se omitirá (ignorará) en silencio. (Para ser más precisos, aquí hay una cita del manual de referencia de MySQL: “Si usa la palabra clave IGNORE, los errores que se producen al ejecutar la instrucción INSERT se tratan como advertencias. Por ejemplo, sin IGNORE, una fila que duplica un índice ÚNICO existente o el valor de PRIMARY KEY en la tabla causa un error de clave duplicada y la declaración se cancela. ”.) Si el registro aún no existe, se creará.
Este segundo método tiene varias debilidades potenciales, incluido el no aborto de la consulta en caso de que ocurra cualquier otro problema (consulte el manual). Por lo tanto, debe usarse si se probó previamente sin la palabra clave IGNORE.
Método 3: usando INSERTAR… EN ACTUALIZACIÓN CLAVE DUPLICADA:
La tercera opción es usar INSERT … ON DUPLICATE KEY UPDATE
sintaxis, y en la parte ACTUALIZAR simplemente no hacer ninguna operación sin sentido (vacía), como calcular 0 + 0 (Geoffray sugiere hacer la asignación id = id para que el motor de optimización MySQL ignore esta operación). La ventaja de este método es que solo ignora los eventos clave duplicados y aún aborta en otros errores.
Como aviso final: esta publicación fue inspirada por Xaprb. También recomendaría consultar su otra publicación sobre cómo escribir consultas SQL flexibles.