
Adrian Ronaldo Hermoza Bayona
PreguntaCual es la diferencia entre usar on duplicate key y solamente update? Por que tambien puedo usar solamente el comando update

DAVID STEVEN BOCAREJO IBAÑEZ
Lo que pasa es que si tu insertas "INSERT" valores que por definición no pueden ser repetidos (Ósea valores Primary key como el ID, o valores que hallas declarado de tipo UNIQUE como en este caso el email) la base de dato proeje estos valores, por lo tanto su reacción es arrojar error y evitar que se pueda ejecutar la acción.
Lo que tu haces con la sentencia "ON DUPLICATE KEY" es decirle a la base de datos, Quiero insertar este registro "por medio del INSERT y el VALUES" peroooo, si este registro ya esta en la base de dato, en lugar de arrojarme un error por favor realiza la siguiente acción "Y le indicas que acción realizar después de la sentencia" .
Ejemplo:
INSERT INTO cleints(client_id ,name,email, birthdate, gender, active)
VALUES(4, 'Pedro', 'email@gamil.com', '26-04-1992', 'M', 0) ON DUPLICATE KEY UPDATE active = VALUES(active)
En este caso Lo que le estas diciendo a la base de datos es, Por favor inserta este registro.
VALUES(4, 'Pedro', 'email@gamil.com', '26-04-1992', 'M', 0)
ON DUPLICATE KEY
En lugar de arrojarme error actualiza el Atributo "active" y pone el valor que te indique en la seccion de VALUES "Segunda linea de codigo, es decir 0".
active = VALUES(active)
Ósea a groso modo si solo utilizas el ON DUPLICATE KEY, el código realiza la Un registro nuevo si no esta duplicado y si si lo esta realiza lo que tu le indiques después de la sentencia.
en cambio si solo pones el UPDATE, esta es una actualización así que solo hace un cambio de valores ya existentes.

Adrian Ronaldo Hermoza Bayona
Perfecto muchas gracias

Fernando Chavez
En principio ninguna. On Duplicate Key te sirve para tener un flujo más rápido cuando estas insertando data y deseas modificar campos en especifico.
Pero por ejemplo, si desearas modificar todas las columnas de una tabla en las que se cumpla X condición te vendría mucho mejor usar Update directamente.