Curso de Fundamentos de Bases de Datos

INSERT en MySQL con ON DUPLICATE KEY

Curso de Fundamentos de Bases de Datos

Contenido del curso

Manipulación de Datos

INSERT en MySQL con ON DUPLICATE KEY

Resumen

El comando INSERT en MySQL es la puerta de entrada para poblar tus tablas con datos reales y empezar a generar información útil. Aprenderás la sintaxis básica, cómo insertar múltiples registros, y cómo manejar errores de llaves duplicadas con IGNORE y ON DUPLICATE KEY UPDATE.

¿Cuál es la sintaxis básica de INSERT en MySQL?

La estructura es directa: indicas la tabla, las columnas que vas a llenar y los valores en forma de tupla. No necesitas mandar columnas autogeneradas como product_id (con auto increment) ni created_at y updated_at (con current timestamp).

sql INSERT INTO products (name, slug) VALUES ('pluma azul', 'pluma-azul');

Ejecutas y MySQL te responde con one row affected. Si haces SELECT * FROM products, ahí aparece tu registro con descripción nula y los timestamps generados automáticamente [01:30].

¿Qué columnas debo incluir en un INSERT? Solo las que no son autogeneradas y las que no aceptan nulos. Las columnas con auto increment, current timestamp o que permiten NULL puedes omitirlas.

¿Cómo inserto varios registros de golpe?

En lugar de cerrar con punto y coma después del primer paréntesis, separas las tuplas con coma. MySQL no se fija en saltos de línea, solo en que la sentencia termine bien.

sql INSERT INTO products (name, slug, description) VALUES ('pluma negra', 'pluma-negra', 'esto es una pluma para vender'), ('pluma rosa', 'pluma-rosa', 'esto es una pluma para vender');

El resultado es two rows affected y ambos registros aparecen con su descripción [05:40].

¿Qué pasa cuando intento insertar una llave duplicada?

Si una columna tiene una restricción UNIQUE, como el slug, MySQL te lanza un error: Duplicate entry 'pluma azul' for key 'products.slug'. Esa restricción protege la integridad del negocio: piensa en placas de auto, matrículas o slugs de SEO, donde el dato no se puede repetir [03:50].

Tienes tres caminos para manejar este escenario:

  • Dejar que el error escale a tu aplicación y atraparlo desde el código (ODBC, active record, etc.).
  • Usar INSERT IGNORE para silenciar el error y convertirlo en warning.
  • Usar ON DUPLICATE KEY UPDATE para definir qué hacer si el conflicto ocurre.

¿Cuándo conviene usar INSERT IGNORE?

Casi nunca. Cuando agregas IGNORE, MySQL intenta insertar y si truena, te dice zero rows affected con un warning que puedes revisar con SHOW WARNINGS. El problema es que es como un try sin catch: tapas el sol con un dedo.

¿Qué hace INSERT IGNORE? Convierte los errores de inserción en warnings silenciosos. Si insertas 150 mil registros y muchos fallan, no te enteras a menos que revises los warnings manualmente.

Usarlo a ciegas puede provocar que creas haber insertado miles de filas cuando en realidad no se grabó nada. Por eso existe una alternativa mucho más profesional [07:50].

¿Cómo funciona ON DUPLICATE KEY UPDATE?

Esta cláusula te permite definir una acción de respaldo cuando MySQL detecta una llave duplicada. La burbuja del error se contiene dentro de la misma sentencia, sin necesidad de atraparla desde la aplicación.

sql INSERT INTO products (name, slug) VALUES ('pluma azul', 'pluma-azul') ON DUPLICATE KEY UPDATE description = 'ejecutado en el on duplicate key';

MySQL intenta insertar, no puede por la llave duplicada, y entonces ejecuta el UPDATE que definiste. El conteo dice two rows affected porque cuenta el intento fallido y la actualización exitosa, pero realmente solo se modificó una fila [09:30].

¿Puedo hacer operaciones dentro del ON DUPLICATE KEY?

Sí, y aquí está lo interesante. No estás limitado a strings; puedes hacer operaciones matemáticas con los valores existentes de la fila.

sql INSERT INTO products (name, slug) VALUES ('pluma azul', 'pluma-azul') ON DUPLICATE KEY UPDATE description = 10 * price;

MySQL toma el valor actual de price en esa tupla, lo multiplica por 10 y lo guarda en description. Como no usaste comillas, MySQL lo interpreta como operación aritmética y no como texto literal [14:20].

¿Qué funciones útiles puedo combinar con INSERT?

Dos funciones de MySQL te facilitan la vida cuando trabajas con datos dinámicos o de prueba.

  • CONCAT: recibe N strings y los une en una sola cadena. SELECT CONCAT('hola', ' ', 'adiós', 0, 'nada') devuelve hola adiós0nada. No usa el símbolo + ni el ., es una función explícita.
  • RAND: devuelve un número aleatorio entre 0 y 1 con muchos decimales. Es ideal para llenar datos fake, por ejemplo UPDATE products SET price = RAND() * 100 asigna precios entre 0 y 100 a todas las filas.

¿Para qué sirve RAND() en MySQL? Genera valores aleatorios entre 0 y 1, perfectos para poblar tablas de prueba o asignar valores ficticios sin escribirlos uno por uno.

Cuidado con UPDATE sin cláusula WHERE: aplica el cambio a todos los registros de la tabla, sin discriminación.

¿Cómo agrego una columna nueva para practicar estos comandos?

Con ALTER TABLE puedes inyectar columnas en cualquier momento. Por ejemplo, para sumar un precio después del slug:

sql ALTER TABLE products ADD COLUMN price FLOAT AFTER slug;

Luego puedes llenarla con UPDATE products SET price = RAND() * 100 y verificar el resultado con DESC products y SELECT * FROM products. Verás precios como 51.38, 86.71, 79.39, 36.85 distribuidos de forma aleatoria [16:40].

La potencia real aparece cuando combinas INSERT, ON DUPLICATE KEY UPDATE y operaciones aritméticas: el manejador de base de datos protege la integridad de tus datos únicos mientras ejecuta la lógica de negocio que tú diseñaste. ¿Ya identificaste qué columnas de tu modelo deberían ser únicas? Cuéntame en los comentarios qué reglas de unicidad aplicarías en tu proyecto.