Guía completa de INSERT y UPDATE en MySQL: De básicos a errores

目次

1. Introducción

MySQL es un popular sistema de gestión de bases de datos relacionales utilizado en muchas aplicaciones web y sistemas de gestión de bases de datos. En particular, las sentencias «INSERT» y «UPDATE», utilizadas para agregar o actualizar datos, cumplen un rol importante como operaciones básicas de datos. Al comprender correctamente estas sentencias y utilizarlas de manera eficiente, la operación de la base de datos se vuelve fluida.

En este artículo, explicamos en detalle desde el uso básico de las sentencias INSERT y UPDATE en MySQL hasta operaciones avanzadas. Este contenido es útil para principiantes hasta usuarios intermedios, por lo que le invitamos a consultarlo.

2. Lo básico de la instrucción INSERT

Sintaxis básica de la instrucción INSERT

La sintaxis básica de la instrucción INSERT es la siguiente.

INSERT INTO nombre_tabla (columna1, columna2, ...)
VALUES (valor1, valor2, ...);

Por ejemplo, consideremos el caso de agregar un nuevo usuario a la tabla users.

INSERT INTO users (name, email, age)
VALUES ('Yamada Tarō', 'taro@example.com', 30);

Esta consulta SQL inserta los valores «Yamada Tarō», «taro@example.com» y «30» en las columnas name, email y age de la tabla users, respectivamente.

Inserción de múltiples filas

En MySQL, también es posible insertar múltiples filas de datos a la vez. La sintaxis en ese caso es la siguiente.

INSERT INTO users (name, email, age)
VALUES
('Satō Hanako', 'hanako@example.com', 25),
('Suzuki Ichirō', 'ichiro@example.com', 40);

Al usar este método, se puede reducir el número de accesos a la base de datos y mejorar el rendimiento.

Manejo de valores NULL

Al usar la instrucción INSERT, puede que sea necesario manejar valores NULL. Por ejemplo, si age no está configurado, se describe de la siguiente manera.

INSERT INTO users (name, email, age)
VALUES ('Tanaka Jirō', 'jiro@example.com', NULL);

Como punto de atención, si una columna tiene una restricción NOT NULL, insertar un valor NULL causará un error. En este caso, es necesario establecer un valor predeterminado o especificar un valor.

3. Lo básico de la instrucción UPDATE

Sintaxis básica de la instrucción UPDATE

La instrucción UPDATE se utiliza para modificar los datos de los registros existentes. En esta sección, se explica la sintaxis básica, los métodos de actualización condicional y la importancia de la cláusula WHERE.

UPDATE nombre_de_tabla
SET columna1 = nuevo_valor1, columna2 = nuevo_valor2
WHERE condición;

Por ejemplo, consideremos el caso de actualizar la edad de un usuario específico en la tabla users.

UPDATE users
SET age = 35
WHERE name = 'Yamada Tarō';

Esta consulta SQL actualiza la edad a 35 para el usuario cuyo nombre es «Yamada Tarō» en la tabla users.

Importancia de la cláusula WHERE

Si se omite la cláusula WHERE en una instrucción UPDATE, se actualizarán todas las filas de la tabla. Esto puede causar pérdida de datos no intencionada, por lo que siempre debe especificarse una condición.

-- En caso de omitir la cláusula WHERE
UPDATE users
SET age = 30;

Esta consulta SQL establece la edad de todos los usuarios en 30.

Actualización condicional

Para especificar múltiples condiciones, se utilizan AND o OR.

UPDATE users
SET age = 28
WHERE name = 'Satō Hanako' AND email = 'hanako@example.com';

De esta manera, es posible actualizar los datos con condiciones más precisas.

4. Operación que combina INSERT y UPDATE

En las operaciones de base de datos, a menudo se mezclan casos en los que se agregan nuevos datos y casos en los que se actualizan datos existentes. En tales escenarios, utilizando sentencias INSERT ... ON DUPLICATE KEY UPDATE o REPLACE, se puede procesar de manera eficiente. En esta sección, explicamos en detalle el uso y los puntos de atención de cada una.

Uso de INSERT … ON DUPLICATE KEY UPDATE

INSERT ... ON DUPLICATE KEY UPDATE es efectivo cuando existen restricciones de clave primaria o clave única. Utilizando esta sintaxis, se puede realizar en una sola sentencia SQL la operación de actualizar si los datos existen o insertar si no existen.

Sintaxis

INSERT INTO nombre_tabla (columna1, columna2, ...)
VALUES (valor1, valor2, ...)
ON DUPLICATE KEY UPDATE
columna1 = nuevo_valor1, columna2 = nuevo_valor2, ...;

Ejemplo de uso

Consideremos el caso de agregar un nuevo usuario a la tabla users. Si ya existe el mismo email, se actualiza el name y age de ese usuario.

INSERT INTO users (email, name, age)
VALUES ('taro@example.com', 'Yamada Tarō', 30)
ON DUPLICATE KEY UPDATE
name = VALUES(name),
age = VALUES(age);

Esta sentencia SQL realiza las siguientes acciones:

  1. Si no existe un registro con email = 'taro@example.com', inserta los datos.
  2. Si existe un registro existente, actualiza name y age.

Puntos de atención

  • Si hay una columna AUTO_INCREMENT, el contador aumenta incluso si ocurre una clave duplicada. Esto puede causar comportamientos no deseados, por lo que se debe tener cuidado.
  • Utilizando la función VALUES(), se puede usar directamente el valor que se intentaba insertar en la actualización.

Uso de la sentencia REPLACE y sus diferencias

La sentencia REPLACE elimina completamente los datos existentes al insertar datos y luego inserta los nuevos datos. A diferencia de INSERT ... ON DUPLICATE KEY UPDATE, su característica es que el registro original se elimina.

Sintaxis

REPLACE INTO nombre_tabla (columna1, columna2, ...)
VALUES (valor1, valor2, ...);

Ejemplo de uso

Inserta datos en la tabla users y, si hay duplicación en email, elimina los datos existentes e inserta los nuevos datos.

REPLACE INTO users (email, name, age)
VALUES ('taro@example.com', 'Yamada Tarō', 30);

Esta sentencia SQL realiza las siguientes acciones:

  1. Si existe un registro con email = 'taro@example.com', elimina ese registro.
  2. Inserta los nuevos datos.

Puntos de atención

  • Dado que se realiza una eliminación y una inserción, puede afectar a los desencadenadores o restricciones de clave externa.
  • Se debe tener cuidado con los efectos secundarios de la eliminación de datos (pérdida de datos relacionados).

Consideraciones de rendimiento

INSERT ... ON DUPLICATE KEY UPDATE y la sentencia REPLACE tienen ventajas y desventajas respectivas. En bases de datos a gran escala o en operaciones de alta frecuencia, las diferencias en rendimiento son importantes, por lo que se deben considerar los siguientes puntos.

CaracterísticaINSERT … ON DUPLICATE KEY UPDATEREPLACE
Flujo de procesamientoInserción o actualizaciónEliminación + inserción
RendimientoGeneralmente rápidoLigeramente más lento debido a la eliminación e inserción
Impacto en claves externas o desencadenadoresSolo actualización, impacto mínimoAfectado durante la eliminación
Riesgo de integridad de datosBajoRiesgo durante la eliminación

Selección de escenarios de uso

  • Casos en los que INSERT … ON DUPLICATE KEY UPDATE es adecuado
  • Cuando existen restricciones de clave externa o desencadenadores y se desea evitar eliminaciones.
  • Cuando la frecuencia de actualización de datos es alta.
  • Casos en los que la sentencia REPLACE es adecuada
  • Cuando se necesita un reemplazo completo de datos.
  • En el caso de tablas simples que no se ven afectadas por restricciones de clave externa o desencadenadores.

5. Ejemplo práctico

Aquí, introducimos casos de uso reales que utilizan las sentencias INSERT y UPDATE de MySQL, así como «INSERT … ON DUPLICATE KEY UPDATE» y «REPLACE». Esto le permite entender cómo aplicar los conocimientos aprendidos hasta ahora en la práctica.

Caso de uso 1: Sistema de gestión de inventario

En un sistema de gestión de inventario, se registran y actualizan frecuentemente la información de los productos y las cantidades en stock. Para agregar un nuevo producto, se utiliza la sentencia INSERT; para actualizar un producto existente, se utiliza UPDATE o «INSERT … ON DUPLICATE KEY UPDATE».

Inserción y actualización de datos de productos

Por ejemplo, supongamos que la tabla de productosproducts está estructurada de la siguiente manera.

Nombre de columnaTipo de datoDescripción
product_idINTID de producto (clave primaria)
nameVARCHAR(255)Nombre del producto
stockINTCantidad en stock
Registro de un nuevo producto
INSERT INTO products (product_id, name, stock)
VALUES (1, 'ordenador portátil', 50);
Actualización de la cantidad en stock (producto existente)
UPDATE products
SET stock = stock + 20
WHERE product_id = 1;
Adición nueva o actualización de la cantidad en stock

Si desea registrar un nuevo producto o actualizar la cantidad en stock si ya existe, utilice «INSERT … ON DUPLICATE KEY UPDATE».

INSERT INTO products (product_id, name, stock)
VALUES (1, 'ordenador portátil', 50)
ON DUPLICATE KEY UPDATE
stock = stock + 50;

Esta sentencia SQL realiza lo siguiente:

  • Si no existe un dato con ID de producto 1, lo inserta.
  • Si existe un dato con ID de producto 1, agrega 50 a la cantidad en stock.

Caso de uso 2: Gestión de información de usuarios

En una aplicación web, se registran y actualizan diariamente la información de los usuarios. Para registrar un nuevo usuario, se utiliza INSERT; para actualizar la información de un usuario existente, se utiliza UPDATE o «INSERT … ON DUPLICATE KEY UPDATE».

Estructura de la tabla de usuarios

Nombre de columnaTipo de datoDescripción
user_idINTID de usuario (clave primaria)
nameVARCHAR(255)Nombre de usuario
emailVARCHAR(255)Dirección de correo electrónico
last_loginDATETIMEFecha y hora del último inicio de sesión
Registro de un nuevo usuario
INSERT INTO users (user_id, name, email, last_login)
VALUES (1, 'Yamada Taro', 'taro@example.com', NOW());
Actualización de la información del usuario

Por ejemplo, si un usuario cambia su perfil.

UPDATE users
SET name = 'Yamada Hanako', email = 'hanako@example.com'
WHERE user_id = 1;
Registro nuevo o actualización de información

Si un usuario inicia sesión por primera vez, se registra como nuevo; si ya existe, se actualiza la fecha y hora del último inicio de sesión.

INSERT INTO users (user_id, name, email, last_login)
VALUES (1, 'Yamada Taro', 'taro@example.com', NOW())
ON DUPLICATE KEY UPDATE
last_login = NOW();

Caso de uso 3: Actualización periódica de datos

Al manejar datos de sensores o registros, se insertan nuevos datos cada minuto o segundo. En este caso, es necesario insertar nuevos datos con INSERT o actualizar datos existentes de manera condicional.

Inserción de datos de registro

Ejemplo de una tablasensor_logs que registra datos de sensores.

Nombre de columnaTipo de datoDescripción
sensor_idINTID de sensor (clave primaria)
temperatureFLOATTemperatura
last_updatedDATETIMEFecha y hora de la última actualización
Registro de nuevos datos de sensor
INSERT INTO sensor_logs (sensor_id, temperature, last_updated)
VALUES (1, 25.5, NOW());
Actualización o inserción de datos

Si el ID de sensor ya existe, actualiza los datos; si no existe, los inserta.

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);

Puntos de atención y mejores prácticas

  1. Manejo de errores:
    Al utilizar ON DUPLICATE KEY UPDATE o REPLACE, es importante verificar de antemano el impacto de los desencadenadores o las restricciones de clave externa.
  2. Optimización del rendimiento:
    Al manejar grandes volúmenes de datos, utilice el diseño de índices y transacciones para realizar operaciones de manera eficiente.
  3. Integridad de los datos:
    Especialmente con REPLACE, que implica eliminación e inserción, es necesario tomar medidas para evitar la pérdida de datos relacionados.

6. Errores y métodos de resolución

Al usar sentencias INSERT o UPDATE en MySQL, pueden ocurrir varios errores. En esta sección, explicamos ejemplos de errores comunes, sus causas y métodos específicos de resolución.

Ejemplos de errores comunes

1. Error de entrada duplicada

Contenido del error:

Error: Duplicate entry '1' for key 'PRIMARY'

Causa:

  • Ocurre cuando se intenta insertar un valor que ya existe en una columna con clave principal o restricción única (UNIQUE).

Método de resolución:

  • Usar ON DUPLICATE KEY UPDATE:
    Realiza una actualización si existe una entrada duplicada.
INSERT INTO users (user_id, name, email)
VALUES (1, 'Yamada Tarō', 'taro@example.com')
ON DUPLICATE KEY UPDATE
name = VALUES(name),
email = VALUES(email);
  • Verificar la existencia antes de insertar datos:
    Para evitar duplicados, verifica previamente si existe el dato correspondiente.
SELECT COUNT(*) FROM users WHERE user_id = 1;

2. Error de restricción de clave externa

Contenido del error:

Error: Cannot add or update a child row: a foreign key constraint fails

Causa:

  • Ocurre debido a la restricción de clave externa (FOREIGN KEY) cuando no existe el dato en la tabla padre.

Método de resolución:

  • Insertar los datos relacionados en la tabla padre.
INSERT INTO parent_table (id, name) VALUES (1, 'Datos padre');
  • Desactivar la restricción de clave externa para realizar la operación (aunque no se recomienda).
SET FOREIGN_KEY_CHECKS = 0;
-- Operación de datos
SET FOREIGN_KEY_CHECKS = 1;

3. Error relacionado con valores NULL

Contenido del error:

Error: Column 'name' cannot be null

Causa:

  • Ocurre cuando se intenta insertar un valor NULL en una columna con restricción NOT NULL.

Método de resolución:

  • Establecer un valor predeterminado.
ALTER TABLE users MODIFY name VARCHAR(255) NOT NULL DEFAULT 'No configurado';
  • Insertar un valor apropiado en la sentencia INSERT.
INSERT INTO users (name, email, age)
VALUES ('Yamada Tarō', 'taro@example.com', NULL);

4. Error de tipo de datos

Contenido del error:

Error: Data truncated for column 'age' at row 1

Causa:

  • Ocurre cuando se intenta insertar o actualizar un valor que no coincide con el tipo de datos especificado en la columna.

Método de resolución:

  • Verificar el tipo de datos y usar un valor apropiado.
INSERT INTO users (age) VALUES (30); -- En caso de tipo INT
  • Cambiar el tipo de datos de la columna (si es necesario).
ALTER TABLE users MODIFY age VARCHAR(10);

5. Error relacionado con bloqueo de tabla

Contenido del error:

Error: Lock wait timeout exceeded; try restarting transaction

Causa:

  • Ocurre cuando otra transacción ha bloqueado la tabla y el bloqueo no se libera después de un tiempo determinado.

Método de resolución:

  • Para evitar conflictos de transacciones, realiza operaciones como las siguientes.
  • Divide las consultas para reducir los bloqueos de tabla.
  • Crea índices apropiados para mejorar la velocidad de ejecución de las consultas.

Mejores prácticas para el rendimiento y la prevención de errores

  1. Gestión de transacciones
  • Cuando se realizan múltiples INSERT o UPDATE, usa transacciones para gestionar las operaciones de manera segura.
START TRANSACTION;
INSERT INTO orders (order_id, user_id) VALUES (1, 1);
UPDATE users SET last_order = NOW() WHERE user_id = 1;
COMMIT;
  1. Optimización de índices
  • Establece índices apropiados en claves principales o externas para reducir el riesgo de errores y mejorar el rendimiento.
ALTER TABLE users ADD INDEX (email);
  1. Rollback en caso de error
  • En caso de error, realiza un rollback para mantener la integridad de los datos.
START TRANSACTION;
-- Varias operaciones
ROLLBACK; -- En caso de error

7. FAQ

Al usar las sentencias INSERT o UPDATE de MySQL, muchas personas tienen dudas comunes. En esta sección, profundizaremos la comprensión de los lectores a través de preguntas frecuentes y sus respuestas.

P1: ¿Cuál usar, INSERT o UPDATE?

Respuesta:

INSERT se utiliza para agregar nuevos datos, y UPDATE para modificar datos existentes. Sin embargo, cuando se mezclan la adición de nuevos datos y la actualización de existentes, lo óptimo es usar «INSERT … ON DUPLICATE KEY UPDATE».Ejemplo:

INSERT INTO users (user_id, name, email)
VALUES (1, 'Yamada Tarō', 'taro@example.com')
ON DUPLICATE KEY UPDATE
name = VALUES(name),
email = VALUES(email);

Esta sintaxis permite procesar la adición de datos nuevos y la actualización de datos existentes en una sola consulta.

P2: ¿Se puede usar ON DUPLICATE KEY UPDATE en todos los casos de uso?

Respuesta:

No, ON DUPLICATE KEY UPDATE tiene las siguientes limitaciones.

  1. Solo funciona si se ha configurado una clave primaria o una clave única. Si no está configurada, no se produce un error, pero no se comportará como se espera.
  2. En actualizaciones de grandes volúmenes de datos, puede haber una disminución en el rendimiento. En ese caso, considere el uso de transacciones o la partición de datos.

P3: ¿Cuál es la diferencia entre REPLACE y ON DUPLICATE KEY UPDATE?

Respuesta:

Ambos son similares, pero tienen grandes diferencias en su funcionamiento.

CaracterísticaON DUPLICATE KEY UPDATEREPLACE
Contenido principal del procesamientoActualiza datos en caso de clave duplicadaEn caso de clave duplicada, elimina + inserta nuevo
Impacto en claves foráneas o triggersSolo actualización, impacto mínimoPuede afectar al eliminar
RendimientoGeneralmente rápidoLigeramente más lento por eliminar e insertar
Riesgo de integridad de datosBajoHay riesgo al eliminar

Como criterio de selección, si se desea solo actualizar sin eliminar datos, use ON DUPLICATE KEY UPDATE; si se quiere reemplazar completamente, use REPLACE.

P4: ¿Qué pasa si se olvida la cláusula WHERE?

Respuesta:

Si se ejecuta la sentencia UPDATE sin especificar WHERE, se actualizarán todos los registros de la tabla. Esto es muy peligroso y puede causar cambios no intencionados en los datos.Ejemplo:

-- Se actualiza age a 30 en todos los registros
UPDATE users
SET age = 30;

Medidas:

  • Siempre especifique WHERE para actualizar solo los datos que cumplan con condiciones específicas.
  • Como mejor práctica, ejecute primero una sentencia SELECT para verificar los datos objetivo antes de la ejecución.
SELECT * FROM users WHERE name = 'Yamada Tarō';
UPDATE users SET age = 35 WHERE name = 'Yamada Tarō';

P5: ¿Hay métodos para acelerar las sentencias INSERT o UPDATE?

Respuesta:

Se puede mejorar el rendimiento con los siguientes métodos.

  1. Optimización de índices:
    Establecer índices apropiados en las columnas necesarias acelera las búsquedas y los procesos de actualización.
CREATE INDEX idx_email ON users(email);
  1. Operaciones en múltiples filas:
    Es más eficiente insertar o actualizar múltiples filas de una vez en lugar de procesar una por una.
INSERT INTO users (name, email, age)
VALUES
('Satō Hanako', 'hanako@example.com', 25),
('Suzuki Ichirō', 'ichiro@example.com', 40);
  1. Uso de transacciones:
    Procesar múltiples operaciones en una sola transacción reduce los conflictos de bloqueo.
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 previamente para no realizar actualizaciones o inserciones no necesarias.
SELECT COUNT(*) FROM users WHERE user_id = 1;
-- Evitar inserciones o actualizaciones innecesarias

P6: ¿Cómo prevenir errores en INSERT o UPDATE?

Respuesta:

Para prevenir errores, utilice los siguientes métodos.

  • Verificación de tipos de datos:
    Asegúrese de que los datos a insertar o actualizar coincidan con el tipo de datos de la columna.
  • Configuración adecuada de restricciones:
    Configure correctamente las claves primarias, únicas y foráneas para mantener la integridad de los datos.
  • Manejo de errores:
    Implemente el manejo de errores en el programa para casos de ocurrencia de errores.
-- En caso de error, hacer rollback
START TRANSACTION;
INSERT INTO users (user_id, name, email) VALUES (1, 'Yamada Tarō', 'taro@example.com');
ROLLBACK; -- Si es necesario

8. Resumen

En este artículo, hemos explicado ampliamente desde los conceptos básicos de las sentencias INSERT y UPDATE en MySQL hasta operaciones avanzadas, casos de uso prácticos, manejo de errores y respuestas a preguntas frecuentes. A continuación, repasemos los puntos importantes.

Puntos importantes de este artículo

1. Conceptos básicos de INSERT

  • La sentencia INSERT se utiliza para insertar nuevos datos en una tabla.
  • Es posible insertar múltiples filas de datos, lo que permite realizar operaciones eficientes.
  • Es necesario prestar atención a los valores NULL y las restricciones NOT NULL.

2. Conceptos básicos de UPDATE

  • La sentencia UPDATE se utiliza para actualizar datos existentes según condiciones específicas.
  • Es necesario especificar siempre la cláusula WHERE para evitar actualizaciones no intencionadas de todas las filas.

3. Combinación de INSERT y UPDATE

  • INSERT ... ON DUPLICATE KEY UPDATE realiza la inserción de nuevos datos y la actualización de datos existentes en una sola operación.
  • La sentencia REPLACE elimina los datos y los inserta de nuevo, por lo que es necesario prestar atención a los impactos en triggers y claves foráneas.

4. Ejemplos prácticos

  • Aprendimos cómo utilizar las sentencias INSERT y UPDATE en casos de uso como la gestión de inventarios o la gestión de información de usuarios.
  • Mostramos las mejores prácticas para procesar múltiples operaciones de manera eficiente.

5. Errores y soluciones

  • Explicamos las causas y soluciones de problemas comunes como entradas duplicadas, restricciones de claves foráneas y errores de inserción de valores NULL.
  • El uso de transacciones y el diseño de índices es importante.

6. FAQ

  • Respondimos a dudas comunes como la distinción entre INSERT y UPDATE, el alcance de ON DUPLICATE KEY UPDATE y métodos de optimización de rendimiento.

Pasos siguientes

Las sentencias INSERT y UPDATE de MySQL son la base de las operaciones de base de datos y habilidades indispensables en el desarrollo de cualquier aplicación. Basándose en lo aprendido en este artículo, considere los siguientes pasos.

  1. Aprendizaje de la gestión de transacciones:
    Para realizar operaciones de base de datos más avanzadas, profundicemos en la comprensión de cómo utilizar las transacciones.
  2. Optimización del diseño de índices:
    Adquiramos el diseño de índices para mantener el rendimiento de las consultas cuando la cantidad de datos aumenta.
  3. Gestión de logs en caso de errores:
    Introduzcamos métodos de registro y análisis de logs para identificar rápidamente la causa cuando ocurre un error.
  4. Utilice la documentación oficial de MySQL:
    Para información más detallada o funciones más recientes, consulte la documentación oficial de MySQL.

Finalmente

Espero que este artículo sea de referencia para entender y usar eficientemente las sentencias INSERT y UPDATE. Al dominar las operaciones básicas de datos, sus habilidades en gestión de bases de datos mejorarán, permitiéndole manejar desarrollos de aplicaciones más avanzados.

¡Sigamos profundizando en el conocimiento de MySQL!