- 1 1. Introducción
- 2 2. Conceptos básicos de INSERT
- 3 3. Conceptos básicos de UPDATE
- 4 4. Combinando INSERT y UPDATE
- 5 5. Ejemplos prácticos
- 6 6. Errores comunes y cómo solucionarlos
- 7 7. Preguntas frecuentes
- 7.1 P1: ¿Cuál debería usar, INSERT o UPDATE?
- 7.2 P2: ¿Puedo usar ON DUPLICATE KEY UPDATE para cualquier caso de uso?
- 7.3 P3: ¿Cuál es la diferencia entre REPLACE y ON DUPLICATE KEY UPDATE?
- 7.4 P4: ¿Qué ocurre si olvido la cláusula WHERE?
- 7.5 P5: ¿Hay alguna forma de acelerar INSERT y UPDATE?
- 7.6 Q6: ¿Cómo puedo prevenir errores de INSERT o UPDATE?
- 8 8. Resumen
1. Introducción
MySQL es un popular sistema de gestión de bases de datos relacional utilizado en muchas aplicaciones web y sistemas de gestión de bases de datos. Entre sus características, la sentencia INSERT y la sentencia UPDATE —utilizadas para agregar y modificar datos— juegan un papel esencial como operaciones fundamentales de datos. Al comprenderlas correctamente y utilizarlas de manera eficiente, las operaciones de bases de datos se vuelven más fluidas.
En este artículo, ofrecemos una explicación detallada de MySQL INSERT y UPDATE, desde el uso básico hasta operaciones avanzadas. El contenido es adecuado para usuarios principiantes e intermedios, así que utilícelo como referencia.
2. Conceptos básicos de INSERT
Sintaxis básica de INSERT
La sintaxis básica de una sentencia INSERT es la siguiente.
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);
Como ejemplo, considere agregar un nuevo usuario a la tabla users.
INSERT INTO users (name, email, age)
VALUES ('Taro Yamada', 'taro@example.com', 30);
Esta sentencia SQL inserta los valores “Taro Yamada”, “taro@example.com” y “30” en las columnas name, email y age de la tabla users, respectivamente.
Insertar múltiples filas
En MySQL, también puede insertar múltiples filas de datos a la vez. En ese caso, la sintaxis es la siguiente.
INSERT INTO users (name, email, age)
VALUES
('Hanako Sato', 'hanako@example.com', 25),
('Ichiro Suzuki', 'ichiro@example.com', 40);
Usar este método reduce la cantidad de accesos a la base de datos y puede mejorar el rendimiento.
Manejo de valores NULL
Al usar una sentencia INSERT, puede necesitar manejar valores NULL. Por ejemplo, si age no está definido, escríbalo de la siguiente manera.
INSERT INTO users (name, email, age)
VALUES ('Jiro Tanaka', 'jiro@example.com', NULL);
Tenga en cuenta que si una columna tiene una restricción NOT NULL, insertar un valor NULL producirá un error. En ese caso, debe establecer un valor predeterminado o especificar un valor explícitamente.
3. Conceptos básicos de UPDATE
Sintaxis básica de UPDATE
La sentencia UPDATE se utiliza para modificar datos en registros existentes. En esta sección, explicamos la sintaxis básica, cómo actualizar con condiciones y por qué la cláusula WHERE es importante.
UPDATE table_name
SET column1 = new_value1, column2 = new_value2
WHERE condition;
Como ejemplo, considere actualizar la edad de un usuario específico en la tabla users.
UPDATE users
SET age = 35
WHERE name = 'Taro Yamada';
Esta sentencia SQL actualiza la edad a 35 para el usuario cuyo nombre es “Taro Yamada” en la tabla users.
Por qué la cláusula WHERE es importante
Si omite la cláusula WHERE en una sentencia UPDATE, todas las filas de la tabla serán actualizadas. Esto puede causar pérdida de datos no deseada, así que asegúrese de especificar condiciones.
-- When the WHERE clause is omitted
UPDATE users
SET age = 30;
Esta sentencia SQL establece la edad de todos los usuarios a 30.
Actualizaciones condicionales
Al especificar múltiples condiciones, use AND o OR.
UPDATE users
SET age = 28
WHERE name = 'Hanako Sato' AND email = 'hanako@example.com';
De esta manera, puede actualizar datos con condiciones más precisas.
4. Combinando INSERT y UPDATE
En operaciones de bases de datos, puede encontrarse con situaciones en las que a veces necesita agregar datos nuevos y otras veces actualizar datos existentes. En esos escenarios, puede procesar de manera eficiente usando INSERT ... ON DUPLICATE KEY UPDATE o la sentencia REPLACE. En esta sección, explicamos cómo usar cada una y qué tener en cuenta.
Cómo usar INSERT … ON DUPLICATE KEY UPDATE
INSERT ... ON DUPLICATE KEY UPDATE es eficaz cuando existen restricciones de clave primaria o clave única. Con esta sintaxis, puede realizar “actualizar si existe, insertar si no existe” en una única sentencia SQL.
Sintaxis
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...)
ON DUPLICATE KEY UPDATE
column1 = new_value1, column2 = new_value2, ...;
Ejemplo
Consider adding a new user to the users table. If the same email already exists, update that user’s name and age.
INSERT INTO users (email, name, age)
VALUES ('taro@example.com', 'Taro Yamada', 30)
ON DUPLICATE KEY UPDATE
name = VALUES(name),
age = VALUES(age);
This SQL statement does the following:
- If no record exists with
email = 'taro@example.com', insert the data. - If an existing record does exist, update
nameandage.
Notas
- If there is an
AUTO_INCREMENTcolumn, the counter increases even when a duplicate key occurs. This can cause unintended behavior, so be careful. - By using the
VALUES()function, you can reuse the values you attempted to insert for the update.
Cómo funciona REPLACE y en qué difiere
The REPLACE statement completely deletes existing data (when a duplicate key is found) and then inserts the new data. Unlike INSERT ... ON DUPLICATE KEY UPDATE, the original record is deleted.
Sintaxis
REPLACE INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);
Ejemplo
Insert data into the users table, and if email is duplicated, delete the existing data and insert the new data.
REPLACE INTO users (email, name, age)
VALUES ('taro@example.com', 'Taro Yamada', 30);
This SQL statement does the following:
- If a record exists with
email = 'taro@example.com', delete that record. - Insert the new data.
Notas
- Because it performs delete + insert, it may affect triggers and foreign key constraints.
- Be aware of side effects from deletion (such as losing related data).
Consideraciones de rendimiento
INSERT ... ON DUPLICATE KEY UPDATE and REPLACE each have pros and cons. For large databases or high-frequency operations, performance differences matter, so consider the following points.
| Characteristic | INSERT … ON DUPLICATE KEY UPDATE | REPLACE |
|---|---|---|
| Process flow | Insert or update | Delete + insert |
| Performance | Generally faster | Slightly slower due to delete + insert |
| Impact on foreign keys and triggers | Less impact because it updates only | Affected during deletion |
| Data integrity risk | Lower | Higher risk during deletion |
Elegir el caso de uso adecuado
- When INSERT … ON DUPLICATE KEY UPDATE is suitable
- When foreign key constraints or triggers exist and you want to avoid deletes.
- When updates occur frequently.
- When REPLACE is suitable
- When you need a complete replacement of the data.
- For simple tables not affected by foreign key constraints or triggers.
5. Ejemplos prácticos
Here, we introduce real-world use cases for MySQL INSERT and UPDATE, as well as practical usage of “INSERT … ON DUPLICATE KEY UPDATE” and “REPLACE.” This will help you understand how to apply what you have learned in actual work.
Caso de uso 1: Sistema de gestión de inventario
In an inventory management system, product registration and stock updates happen frequently. Use INSERT to add new products, and use UPDATE or “INSERT … ON DUPLICATE KEY UPDATE” to update existing products.
Inserción y actualización de datos de productos
For example, assume a product table products is structured as follows.
| Column | Data Type | Description |
|---|---|---|
| product_id | INT | Product ID (primary key) |
| name | VARCHAR(255) | Product name |
| stock | INT | Stock quantity |
Registrando un nuevo producto
INSERT INTO products (product_id, name, stock)
VALUES (1, 'Laptop', 50);
Actualizando la cantidad de stock (producto existente)
UPDATE products
SET stock = stock + 20
WHERE product_id = 1;
Insertar nuevo o actualizar la cantidad de stock
If you want to either register a new product or update stock for an existing product, use “INSERT … ON DUPLICATE KEY UPDATE.”
INSERT INTO products (product_id, name, stock)
VALUES (1, 'Laptop', 50)
ON DUPLICATE KEY UPDATE
stock = stock + 50;
This SQL accomplishes the following:
- If no data exists for product ID 1, insert it.
- If data exists for product ID 1, add 50 to the stock quantity.
Caso de uso 2: Gestión de información de usuarios
In web applications, user registration and updates are routine. Use INSERT to register new users, and use UPDATE or “INSERT … ON DUPLICATE KEY UPDATE” to update existing user information.
Estructura de la tabla de usuarios
| Column | Data Type | Description |
|---|---|---|
| user_id | INT | User ID (primary key) |
| name | VARCHAR(255) | User name |
| VARCHAR(255) | Email address | |
| last_login | DATETIME | Last login timestamp |
Registrando un nuevo usuario
INSERT INTO users (user_id, name, email, last_login)
VALUES (1, 'Taro Yamada', 'taro@example.com', NOW());
Actualizando la información del usuario
Por ejemplo, cuando un usuario cambia su perfil.
UPDATE users
SET name = 'Hanako Yamada', email = 'hanako@example.com'
WHERE user_id = 1;
Registrar o actualizar información
Cuando un usuario inicia sesión por primera vez, regístralo; si el usuario ya existe, actualiza la marca de tiempo del último inicio de sesión.
INSERT INTO users (user_id, name, email, last_login)
VALUES (1, 'Taro Yamada', 'taro@example.com', NOW())
ON DUPLICATE KEY UPDATE
last_login = NOW();
Caso de uso 3: Actualizaciones de datos periódicas
Al trabajar con datos de sensores o registros, pueden insertarse nuevos datos cada minuto o segundo. En este caso, se inserta nuevos datos con INSERT o se actualizan los datos existentes de forma condicional.
Insertando datos de registro
Aquí hay una tabla de ejemplo sensor_logs para registrar datos de sensores.
| Column | Data Type | Description |
|---|---|---|
| sensor_id | INT | Sensor ID (primary key) |
| temperature | FLOAT | Temperature |
| last_updated | DATETIME | Last updated timestamp |
Registrando nuevos datos de sensores
INSERT INTO sensor_logs (sensor_id, temperature, last_updated)
VALUES (1, 25.5, NOW());
Actualizar o insertar datos
Si el ID del sensor ya existe, actualiza los datos; de lo contrario, insértalos.
INSERT INTO sensor_logs (sensor_id, temperature, last_updated)
VALUES (1, 25.5, NOW())
ON DUPLICATE KEY UPDATE
temperature = VALUES(temperature),
last_updated = VALUES(last_updated);
Notas y mejores prácticas
- Manejo de errores: Al usar ON DUPLICATE KEY UPDATE o REPLACE, es importante verificar el impacto de los disparadores y las restricciones de clave foránea con anticipación.
- Optimización del rendimiento: Para datos a gran escala, utiliza diseño de índices y transacciones para operar de manera eficiente.
- Integridad de los datos: Especialmente con REPLACE, se produce una eliminación + inserción, por lo que se necesitan medidas para evitar el riesgo de perder datos relacionados.
6. Errores comunes y cómo solucionarlos
Al usar sentencias INSERT y UPDATE de MySQL, pueden ocurrir varios errores. En esta sección, explicamos los errores comunes, sus causas y formas específicas de resolverlos.
Ejemplos de errores comunes
1. Error de entrada duplicada
Mensaje de error:
Error: Duplicate entry '1' for key 'PRIMARY'
Causa:
- Esto ocurre cuando intentas insertar un valor que ya existe en una columna con una clave primaria o una restricción única (UNIQUE).
Cómo solucionarlo:
- Usar ON DUPLICATE KEY UPDATE: Realiza una actualización cuando existe una entrada duplicada.
INSERT INTO users (user_id, name, email) VALUES (1, 'Taro Yamada', 'taro@example.com') ON DUPLICATE KEY UPDATE name = VALUES(name), email = VALUES(email);
- Verificar existencia antes de insertar: Para evitar duplicados, verifica con anticipación si los datos ya existen.
SELECT COUNT(*) FROM users WHERE user_id = 1;
2. Error de restricción de clave foránea
Mensaje de error:
Error: Cannot add or update a child row: a foreign key constraint fails
Causa:
- Esto ocurre cuando los datos de la tabla padre referenciada no existen debido a una restricción de clave foránea (FOREIGN KEY).
Cómo solucionarlo:
- Inserta los datos relacionados en la tabla padre.
INSERT INTO parent_table (id, name) VALUES (1, 'Parent data');
- Desactivar temporalmente las restricciones de clave foránea (no recomendado).
SET FOREIGN_KEY_CHECKS = 0; -- Data operations SET FOREIGN_KEY_CHECKS = 1;
3. Error relacionado con NULL
Mensaje de error:
Error: Column 'name' cannot be null
Causa:
- Esto ocurre cuando intentas insertar un valor NULL aunque la columna tiene una restricción
NOT NULL.
Cómo solucionarlo:
- Establecer un valor predeterminado.
ALTER TABLE users MODIFY name VARCHAR(255) NOT NULL DEFAULT 'Unspecified';
- Insertar un valor apropiado con INSERT.
INSERT INTO users (name, email, age) VALUES ('Taro Yamada', 'taro@example.com', NULL);
4. Error de tipo de datos
Mensaje de error:
Error: Data truncated for column 'age' at row 1
Causa:
- Esto ocurre cuando intentas insertar o actualizar un valor que no coincide con el tipo de datos de la columna.
Cómo solucionar:
- Verifica el tipo de datos y usa un valor apropiado.
INSERT INTO users (age) VALUES (30); -- For an INT column
- Cambia el tipo de datos de la columna (si es necesario).
ALTER TABLE users MODIFY age VARCHAR(10);
5. Error relacionado con bloqueo de tabla
Mensaje de error:
Error: Lock wait timeout exceeded; try restarting transaction
Causa:
- Esto ocurre cuando otra transacción bloquea la tabla y el bloqueo no se libera dentro de un tiempo determinado.
Cómo solucionar:
- Para evitar la contención de transacciones, considera acciones como:
- Dividir consultas para reducir el bloqueo de la tabla.
- Crear índices apropiados para acelerar la ejecución de consultas.
Mejores prácticas para el rendimiento y la prevención de errores
- Usar gestión de transacciones
- Al realizar múltiples INSERT y UPDATE, usa transacciones para gestionar las operaciones de forma fiable.
START TRANSACTION; INSERT INTO orders (order_id, user_id) VALUES (1, 1); UPDATE users SET last_order = NOW() WHERE user_id = 1; COMMIT;
- Optimizar índices
- Establecer índices apropiados en claves primarias y foráneas reduce el riesgo de errores y mejora el rendimiento.
ALTER TABLE users ADD INDEX (email);
- Revertir en caso de errores
- Cuando ocurre un error, realiza un rollback para mantener la integridad de los datos.
START TRANSACTION; -- Some operations ROLLBACK; -- On error

7. Preguntas frecuentes
Al usar sentencias INSERT y UPDATE de MySQL, muchas personas tienen preguntas similares. En esta sección, profundizamos la comprensión mediante preguntas y respuestas comunes.
P1: ¿Cuál debería usar, INSERT o UPDATE?
Respuesta:
Usa INSERT para agregar datos nuevos y UPDATE para modificar datos existentes. Sin embargo, si se combinan inserciones de datos nuevos y actualizaciones de datos existentes, usar “INSERT … ON DUPLICATE KEY UPDATE” es la mejor opción.
Ejemplo:
INSERT INTO users (user_id, name, email)
VALUES (1, 'Taro Yamada', 'taro@example.com')
ON DUPLICATE KEY UPDATE
name = VALUES(name),
email = VALUES(email);
Esta sintaxis puede manejar la inserción de datos nuevos y la actualización de datos existentes en una sola consulta.
P2: ¿Puedo usar ON DUPLICATE KEY UPDATE para cualquier caso de uso?
Respuesta:
No. ON DUPLICATE KEY UPDATE tiene las siguientes limitaciones:
- Solo funciona cuando se define una clave primaria o una clave única. Si no se define ninguna, no se produce un error, pero no se comportará como se espera.
- Para actualizaciones a gran escala, el rendimiento puede degradarse. En ese caso, considera usar transacciones o dividir los datos.
P3: ¿Cuál es la diferencia entre REPLACE y ON DUPLICATE KEY UPDATE?
Respuesta:
Son similares, pero su comportamiento difiere significativamente.
| Characteristic | ON DUPLICATE KEY UPDATE | REPLACE |
|---|---|---|
| Main behavior | Update data when a duplicate key occurs | Delete + insert when a duplicate key occurs |
| Impact on foreign keys and triggers | Less impact because it updates only | May be affected during deletion |
| Performance | Generally faster | Slightly slower due to delete + insert |
| Data integrity risk | Low | Risk exists during deletion |
Como guía, usa ON DUPLICATE KEY UPDATE cuando deseas actualizar sin eliminar datos, y usa REPLACE cuando deseas una sustitución completa.
P4: ¿Qué ocurre si olvido la cláusula WHERE?
Respuesta:
Si ejecutas una sentencia UPDATE sin especificar una cláusula WHERE, todos los registros de la tabla serán actualizados. Esto es extremadamente peligroso y puede causar cambios de datos no deseados.
Ejemplo:
-- The age of all records is updated to 30
UPDATE users
SET age = 30;
Prevención:
- Siempre especifica una cláusula WHERE para que solo se actualicen los datos que coincidan con condiciones específicas.
- Como buena práctica, ejecuta primero una sentencia SELECT para confirmar los datos objetivo antes de ejecutar el UPDATE.
SELECT * FROM users WHERE name = 'Taro Yamada'; UPDATE users SET age = 35 WHERE name = 'Taro Yamada';
P5: ¿Hay alguna forma de acelerar INSERT y UPDATE?
Respuesta:
Puedes mejorar el rendimiento usando los siguientes métodos.
- Optimizar índices: Establece índices apropiados en las columnas requeridas para acelerar las operaciones de búsqueda y actualización.
CREATE INDEX idx_email ON users(email);
- Operaciones por lotes: Es más eficiente insertar o actualizar varias filas a la vez que procesar una fila a la vez.
INSERT INTO users (name, email, age) VALUES ('Hanako Sato', 'hanako@example.com', 25), ('Ichiro Suzuki', 'ichiro@example.com', 40);
- Utilizar transacciones: Procesar múltiples operaciones en una única transacción reduce la contención de bloqueos.
START TRANSACTION; INSERT INTO orders (order_id, user_id) VALUES (1, 1); UPDATE users SET last_order = NOW() WHERE user_id = 1; COMMIT;
- Evitar operaciones innecesarias: Verifique los datos con antelación para evitar actualizaciones o inserciones innecesarias.
SELECT COUNT(*) FROM users WHERE user_id = 1; -- Avoid unnecessary inserts/updates
Q6: ¿Cómo puedo prevenir errores de INSERT o UPDATE?
Respuesta:
Para prevenir errores, utilice los siguientes enfoques.
- Verificar tipos de datos: Asegúrese de que los datos que inserta/actualiza coincidan con el tipo de dato de la columna.
- Establecer restricciones correctamente: Configure adecuadamente claves primarias, claves únicas y restricciones de clave foránea para mantener la integridad de los datos.
- Implementar manejo de errores: Añada lógica en su programa para gestionar los errores cuando ocurran.
-- Roll back on error START TRANSACTION; INSERT INTO users (user_id, name, email) VALUES (1, 'Taro Yamada', 'taro@example.com'); ROLLBACK; -- As needed
8. Resumen
En este artículo, cubrimos una amplia gama de temas: los conceptos básicos y el uso avanzado de las sentencias INSERT y UPDATE de MySQL, casos de uso prácticos, manejo de errores y respuestas a preguntas comunes. A continuación, se presenta un resumen de los puntos clave.
Puntos clave
1. Conceptos básicos de INSERT
- Utilice INSERT para insertar datos nuevos en una tabla.
- Puede insertar varias filas, lo que permite operaciones eficientes.
- Tenga cuidado con los valores NULL y las restricciones NOT NULL.
2. Conceptos básicos de UPDATE
- Utilice UPDATE para modificar datos existentes según condiciones.
- Siempre especifique una cláusula WHERE para evitar actualizar todas las filas accidentalmente.
3. Combinar INSERT y UPDATE
INSERT ... ON DUPLICATE KEY UPDATEpermite insertar datos nuevos y actualizar datos existentes en una sola operación.REPLACEelimina datos y los inserta nuevamente, por lo que debe tener en cuenta los disparadores y las claves foráneas.
4. Ejemplos prácticos
- Aprendió cómo usar INSERT y UPDATE en casos de uso como la gestión de inventario y la gestión de información de usuarios.
- También presentamos buenas prácticas para procesar múltiples operaciones de manera eficiente.
5. Errores y soluciones
- Explicamos causas y soluciones para problemas comunes como entradas duplicadas, restricciones de clave foránea y errores de inserción de NULL.
- El uso de transacciones y el diseño de índices son importantes.
6. Preguntas frecuentes
- Respondimos preguntas comunes sobre la elección entre INSERT y UPDATE, el alcance de ON DUPLICATE KEY UPDATE y la optimización del rendimiento.
Próximos pasos
Las sentencias INSERT y UPDATE de MySQL son fundamentales para las operaciones de bases de datos y habilidades esenciales para el desarrollo de aplicaciones. Con base en lo que aprendió en este artículo, considere los siguientes pasos.
- Aprender gestión de transacciones: Para realizar operaciones de bases de datos más avanzadas, profundice su comprensión sobre cómo usar transacciones.
- Optimizar el diseño de índices: Aprenda el diseño de índices para mantener el rendimiento de consultas a medida que crece el volumen de datos.
- Mejorar el registro de logs para solución de problemas: Introduzca la captura y análisis de logs para poder identificar rápidamente las causas cuando ocurran errores.
- Utilizar la documentación oficial de MySQL: Para más detalles y las últimas funcionalidades, consulte la documentación oficial de MySQL .
Nota final
Esperamos que este artículo le ayude a comprender INSERT y UPDATE y a utilizarlos de manera eficiente. Dominar las operaciones básicas de datos mejorará sus habilidades de gestión de bases de datos y le permitirá abordar desarrollos de aplicaciones más avanzados.
¡Siga profundizando su conocimiento de MySQL!


