sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo puedo hacer 'insertar si no existe' en MySQL?

Use INSERT IGNORE INTO table .

También hay INSERT … ON DUPLICATE KEY UPDATE sintaxis, y puede encontrar explicaciones en 13.2.6.2 INSERTAR... EN ACTUALIZACIÓN DE CLAVE DUPLICADA Declaración .

Publicación de bogdan.org.ua según Caché web de Google :

18 de octubre de 2007

Para empezar:a partir de la última versión de MySQL, la sintaxis presentada en el título no es posible. Pero hay varias formas muy sencillas de lograr lo que se espera utilizando la funcionalidad existente.

Hay 3 soluciones posibles:usar INSERTAR IGNORAR, REEMPLAZAR o INSERTAR... EN ACTUALIZACIÓN DE CLAVE DUPLICADA.

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 podría romperse en cualquier paso de la ejecución. Por lo tanto, debemos asegurarnos de dos cosas:

  1. las ejecuciones repetidas de la canalización no destruirán nuestra> base de datos
  1. las ejecuciones repetidas no morirán debido a errores de "clave principal duplicada>".

Método 1:usando REEMPLAZAR

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, será creado. Sin embargo, usar este método no es eficiente para nuestro caso:no necesitamos sobrescribir los registros existentes, está bien 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 ocurren al ejecutar la declaración INSERT se tratan como advertencias. Por ejemplo, sin IGNORE, una fila que duplica un índice ÚNICO existente o CLAVE PRINCIPAL valor en la tabla causa un error de clave duplicada y la instrucción se cancela”.) Si el registro aún no existe, se creará.

Este segundo método tiene varias debilidades potenciales, incluida la no interrupción 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 DE CLAVE DUPLICADA:

La tercera opción es usar INSERT … ON DUPLICATE KEY UPDATE sintaxis, y en la parte ACTUALIZAR simplemente no haga nada, haga alguna 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 de MySQL ignore esta operación). La ventaja de este método es que solo ignora los eventos de clave duplicada 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.