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
?
mysql
sql
unique-key
ufk
fuente
fuente
INSERT IGNORE
sin laON DUPLICATE KEY
parte, por ejemploINSERT IGNORE INTO xpo.user_permanent_gift (...) VALUES (...)
¿CÓMO IMPLEMENTAR 'insertar si no existe'?
1)
REPLACE INTO
pros:
contras:
demasiado lento.
La tecla de incremento automático CAMBIARÁ (aumentará en 1) si hay coincidencias de entrada
unique key
oprimary key
, porque elimina la entrada anterior y luego inserta una nueva.2)
INSERT IGNORE
pros:
contras:
la tecla de incremento automático no cambiará si hay coincidencias de entrada
unique key
oprimary key
si el índice de incremento automático aumentará en 1se ignorarán algunos otros errores / advertencias, como el error de conversión de datos.
3)
INSERT ... ON DUPLICATE KEY UPDATE
pros:
contras:
parece relativamente complejo si solo desea insertar no actualizar.
la tecla de incremento automático no cambiará si hay coincidencias de entrada
unique key
oprimary key
si el índice de incremento automático aumentará en 14. ¿Hay alguna forma de detener el aumento de la clave de incremento automático si hay coincidencias de entrada
unique key
oprimary 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_mode
configuración después de la versión 5.1" si está usandoinnodb
como 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.fuente
innodb_autoinc_lock_mode
configuración después de la versión 5.1Uso
ON DUPLICATE KEY UPDATE ...
,Negativo: porque
UPDATE
usa 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.
fuente