Alternativa a UPDATE ON DUPLICATE KEY DELETE en MySQL

Lamentablemente, la sentencia expuesta en el título de esta publicación no existe en Mysql. No es posible borrar el registro luego de un UPDATE que genere un duplicado, en la misma sentencia.

La alternativa disponible es utilizar UPDATE IGNORE y luego ejecutar DELETE sobre los registros que fueron ignorados.

Ejemplo

Supongamos que existe la tabla ‘insumos_rubros’ con la asociación entre cada insumo y los rubros a los que pertenece, la cual posee una clave primaria compuesta por los 2 campos: id_insumo y id_rubro.

Al intentar cambiar todos los insumos de un rubro a otro se puede generar un registro duplicado, dado que algunos de ellos podrían haber estado asociados previamente al rubro destino:

mysql> UPDATE insumos_rubros SET id_rubro = 26 WHERE id_rubro = 13;
ERROR 1062 (23000): Duplicate entry '9-26' for key 'PRIMARY'

Rápidamente se nos viene a la mente un intento de solución:

mysql> UPDATE insumos_rubros SET id_rubro = 26 WHERE id_rubro = 13
    -> ON DUPLICATE KEY DELETE;

el cual hubiera generado un error de sintaxis debido a ‘ON DUPLICATE KEY DELETE’.

Aplicando la alternativa de UPDATE IGNORE y luego DELETE sobre los registros que fueron ignorados

mysql> UPDATE IGNORE insumos_rubros SET id_rubro = 26 WHERE id_rubro = 13;
Query OK, 65 rows affected (0.00 sec)

mysql> DELETE FROM insumos_rubros WHERE id_rubro = 13;
Query OK, 3 rows affected (0.00 sec)

logramos el objetivo deseado.

Basado en:

Anuncios