Solución:
Tres maneras. Cualquiera IGNORE
errores duplicados (pero no use eso, vea la nota al final):
INSERT IGNORE
... ; -- without ON DUPLICATE KEY
o intente hacer una actualización redundante cuando haya un duplicado:
INSERT
...
ON DUPLICATE KEY UPDATE
id = id ;
o compruebe si hay duplicados antes de insertar:
INSERT INTO requests
(id, ctg, msg, nick, filled, dated, filldate)
SELECT
NULL, 'urgent', 'Help!', 'Hermione', 'Y', NOW(), NOW()
FROM
dual
WHERE NOT EXISTS
( SELECT * FROM requests WHERE (nick, msg) = ('Hermione', 'Help!') )
AND NOT EXISTS
( SELECT * FROM requests WHERE (ctg, msg) = ('urgent', 'Help!') ) ;
Una diferencia entre la tercera vía y las dos primeras es que cuando hay duplicados, el id
no se incrementará. Con INSERT IGNORE
y INSERT ... ON DUPLICATE KEY
, se incrementará automáticamente y dado que la inserción no se realizará, tendrá espacios en los valores de id
.
También debo agregar que sus scripts siempre deben buscar errores de todos modos y no fallar cuando hay uno. Cualquier consulta o declaración puede fallar y devolver un error ocasionalmente, por varias razones. Los trucos anteriores solo te salvarán de un tipo de error.
*Nota: INSERT IGNORE
ignorará todos insertar relacionado errores, incluso no nulas violaciones de restricciones, por lo que es mejor evitarlo.