INSERTAR ... EN LA CLAVE DUPLICADA (no hacer nada)


184

Tengo una tabla con una clave única para dos columnas:

CREATE  TABLE `xpo`.`user_permanent_gift` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`fb_user_id` INT UNSIGNED NOT NULL ,
`gift_id` INT UNSIGNED NOT NULL ,
`purchase_timestamp` TIMESTAMP NULL DEFAULT now() ,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `user_gift_UNIQUE` (`fb_user_id` ASC, `gift_id` ASC) );

Quiero insertar una fila en esa tabla, pero si la clave existe, ¡no hacer nada! No quiero que se genere un error porque existen las claves.

Sé que existe la siguiente sintaxis:

INSERT ... ON DUPLICATE KEY UPDATE ...

pero hay algo como:

INSERT ... ON DUPLICATE KEY DO NOTHING 

?

Respuestas:


332

Sí, use INSERT ... ON DUPLICATE KEY UPDATE id=id(no activará la actualización de filas aunque idesté asignado a sí mismo).

Si no le importan los errores (errores de conversión, errores de clave externa) y el agotamiento del campo de autoincremento (se incrementa incluso si la fila no se inserta debido a una clave duplicada), use INSERT IGNORE.


55
solo para agregar IGNORE después de INSERT, ¿el resto de la sintaxis es la misma?
ufk

25
@ufk: INSERT IGNOREsin la ON DUPLICATE KEYparte, por ejemploINSERT IGNORE INTO xpo.user_permanent_gift (...) VALUES (...)
BoltClock

125
Tenga en cuenta que INSERT IGNORE también ignora otros errores, como fallas en la conversión de datos.
mjcopple

36
así que usaré ON DUPLICATE KEY UPDATE id = id. Solo quiero ignorar los duplicados de claves, no cualquier otro tipo de error.
ufk

77
cuidado INSERT IGNORE incrementará la columna de incremento automático incluso si la fila no está insertada
WorM

9

¿CÓMO IMPLEMENTAR 'insertar si no existe'?

1) REPLACE INTO

pros:

  1. sencillo.

contras:

  1. demasiado lento.

  2. La tecla de incremento automático CAMBIARÁ (aumentará en 1) si hay coincidencias de entrada unique keyo primary key, porque elimina la entrada anterior y luego inserta una nueva.

2) INSERT IGNORE

pros:

  1. sencillo.

contras:

  1. la tecla de incremento automático no cambiará si hay coincidencias de entrada unique keyo primary keysi el índice de incremento automático aumentará en 1

  2. se ignorarán algunos otros errores / advertencias, como el error de conversión de datos.

3) INSERT ... ON DUPLICATE KEY UPDATE

pros:

  1. puede implementar fácilmente la función 'guardar o actualizar' con esto

contras:

  1. parece relativamente complejo si solo desea insertar no actualizar.

  2. la tecla de incremento automático no cambiará si hay coincidencias de entrada unique keyo primary keysi el índice de incremento automático aumentará en 1

4. ¿Hay alguna forma de detener el aumento de la clave de incremento automático si hay coincidencias de entrada unique keyo primary key?

Como se menciona en el comentario a continuación de @toien: "la columna de incremento automático se efectuará depende de la innodb_autoinc_lock_modeconfiguración después de la versión 5.1" si está usando innodbcomo motor, pero esto también afecta la concurrencia, por lo que debe considerarse bien antes de usarse. Hasta ahora no veo ninguna solución mejor.


la columna de incremento automático se efectuará según la innodb_autoinc_lock_modeconfiguración después de la versión 5.1
toien

1

Uso ON DUPLICATE KEY UPDATE ...,
Negativo: porque UPDATEusa recursos para la segunda acción.

Uso INSERT IGNORE ...,
negativo: MySQL no mostrará ningún error si algo sale mal, por lo que no puede manejar los errores. Úselo solo si no le importa la consulta.


@abdul ¿hay soporte de mysql que explicaste aquí?
Lalit Tarsariya
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.