MySQL INSERT vs UPDATE: Sintaxis, ejemplos, ON DUPLICATE KEY UPDATE y REPLACE

目次

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:

  1. If no record exists with email = 'taro@example.com' , insert the data.
  2. If an existing record does exist, update name and age .

Notas

  • If there is an AUTO_INCREMENT column, 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:

  1. If a record exists with email = 'taro@example.com' , delete that record.
  2. 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.

CharacteristicINSERT … ON DUPLICATE KEY UPDATEREPLACE
Process flowInsert or updateDelete + insert
PerformanceGenerally fasterSlightly slower due to delete + insert
Impact on foreign keys and triggersLess impact because it updates onlyAffected during deletion
Data integrity riskLowerHigher 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.

ColumnData TypeDescription
product_idINTProduct ID (primary key)
nameVARCHAR(255)Product name
stockINTStock 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

ColumnData TypeDescription
user_idINTUser ID (primary key)
nameVARCHAR(255)User name
emailVARCHAR(255)Email address
last_loginDATETIMELast 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.

ColumnData TypeDescription
sensor_idINTSensor ID (primary key)
temperatureFLOATTemperature
last_updatedDATETIMELast 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

  1. 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.
  2. Optimización del rendimiento: Para datos a gran escala, utiliza diseño de índices y transacciones para operar de manera eficiente.
  3. 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

  1. 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;
    
  1. 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);
    
  1. 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:

  1. 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.
  2. 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.

CharacteristicON DUPLICATE KEY UPDATEREPLACE
Main behaviorUpdate data when a duplicate key occursDelete + insert when a duplicate key occurs
Impact on foreign keys and triggersLess impact because it updates onlyMay be affected during deletion
PerformanceGenerally fasterSlightly slower due to delete + insert
Data integrity riskLowRisk 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.

  1. 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);
    
  1. 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);
    
  1. 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;
    
  1. 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 UPDATE permite insertar datos nuevos y actualizar datos existentes en una sola operación.
  • REPLACE elimina 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.

  1. Aprender gestión de transacciones: Para realizar operaciones de bases de datos más avanzadas, profundice su comprensión sobre cómo usar transacciones.
  2. 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.
  3. 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.
  4. 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!