2011-01-04 17 views
153

Tengo una tabla con una clave única para dos columnas:INSERT ... EN copia de la llave (no hacer nada)

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 la mesa, pero si existe la clave, a ¡hacer nada! No quiero que se genere un error porque las claves existen.

sé que existe la siguiente sintaxis:

INSERT ... ON DUPLICATE KEY UPDATE ... 

pero ¿hay algo como:

INSERT ... ON DUPLICATE KEY DO NOTHING 

?

Respuesta

256

Sí, hay INSERT IGNORE, o puede hacer ON DUPLICATE KEY UPDATE id=id.

+3

solo para agregar IGNORE después del INSERT, el resto de la sintaxis es el mismo? – ufk

+19

@ufk: 'INSERT IGNORE' sin la parte' ON DUPLICATE KEY', p. 'INSERT IGNORE INTO xpo.user_permanent_gift (...) VALUES (...)' – BoltClock

+95

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

0

Por lo que sé, realmente no existe.

La ACTUALIZACIÓN IGNORE también ignora cualquier otro error que creo que es muy arriesgado.

Lo que sí (no puede ser la mejor cosa que hacer) es implementar la sintaxis UPDATE con una declaración "inofensiva" ACTUALIZACIÓN así:

INSERT INTO mytable (id, ...) VALUES (4, ...) ON DUPLICATE KEY UPDATE id=4; 

Obviamente, esto tiene escritura innecesaria de E/S, pero para mí esto ha funcionado bien hasta ahora.

Cuestiones relacionadas