UPDATE
La sentencia UPDATE modifica datos existentes en una tabla. Puedes cambiar una o varias columnas de una o más filas a la vez. Sin un WHERE que limite las filas afectadas, el UPDATE modifica todas las filas de la tabla, así que hay que usarlo con precaución.
Sintaxis
UPDATE tabla
SET columna1 = valor1, columna2 = valor2, ...
WHERE condicion;La cláusula SET define qué columnas cambiar y sus nuevos valores. La cláusula WHERE filtra qué filas se actualizan. Sin WHERE, se actualizan todas las filas.
Actualizar una columna
Cambiar el precio del iPhone 15 Pro:
UPDATE productos
SET precio = 1199.99
WHERE id = 1;Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
MySQL informa de cuántas filas coincidieron con el WHERE (Rows matched) y cuántas realmente cambiaron (Changed). Si el precio ya fuera 1199.99, "Changed" sería 0 aunque "Rows matched" fuera 1.
Para verificar:
SELECT nombre, precio FROM productos WHERE id = 1;| nombre | precio |
|---|---|
| iPhone 15 Pro | 1199.99 |
Actualizar varias columnas
Puedes modificar varias columnas en una sola sentencia separándolas con comas:
UPDATE productos
SET precio = 849.99, stock = 70
WHERE id = 2;El Samsung Galaxy S24 pasa a costar 849.99 euros y su stock se actualiza a 70 unidades. Ambos cambios se aplican en una sola operación atómica.
Actualizar con expresiones
Los valores nuevos pueden ser expresiones que referencien las columnas actuales:
-- Subir el precio un 10%
UPDATE productos
SET precio = precio * 1.10
WHERE categoria_id = 6;Query OK, 4 rows affected (0.01 sec)
Rows matched: 4 Changed: 4 Warnings: 0
Los 4 smartphones suben un 10% de precio. MySQL evalúa precio * 1.10 usando el valor actual de cada fila antes de actualizarlo.
-- Descontar 5 unidades del stock
UPDATE productos
SET stock = stock - 5
WHERE id = 1;stock - 5 resta 5 al stock actual. Si el stock era 45, pasa a 40.
UPDATE sin WHERE
Un UPDATE sin WHERE modifica todas las filas de la tabla. Esto es peligroso si no es lo que pretendes:
-- CUIDADO: esto modifica TODOS los productos
UPDATE productos
SET activo = TRUE;Query OK, 0 rows affected (0.01 sec)
Rows matched: 30 Changed: 0 Warnings: 0
En este caso, "Changed: 0" porque todos los productos ya estaban activos. Pero si la sentencia hubiera cambiado algún valor, habría afectado a las 30 filas. Siempre verifica tu WHERE antes de ejecutar un UPDATE.
UPDATE con LIMIT
Puedes limitar el número de filas afectadas con LIMIT:
UPDATE productos
SET precio = precio * 0.90
WHERE categoria_id = 7
ORDER BY precio DESC
LIMIT 1;Query OK, 1 row affected (0.01 sec)
Esto aplica un descuento del 10% solo al portátil más caro de la categoría 7. El ORDER BY precio DESC ordena de mayor a menor y LIMIT 1 limita a una sola fila. Solo el ASUS ROG Zephyrus (el más caro) recibe el descuento.
UPDATE con subconsulta
Puedes usar subconsultas en el SET o en el WHERE:
-- Establecer el precio del producto al precio medio de su categoría
UPDATE productos
SET precio = (
SELECT AVG(p2.precio)
FROM (SELECT precio, categoria_id FROM productos) AS p2
WHERE p2.categoria_id = productos.categoria_id
)
WHERE id = 4;Este ejemplo establece el precio del Xiaomi 14 a la media de precios de la categoría Smartphones. La subconsulta calcula esa media. La tabla derivada intermedia es necesaria porque MySQL no permite referenciar directamente la tabla que se está actualizando en una subconsulta.
UPDATE con CASE
Puedes hacer actualizaciones condicionales con CASE:
UPDATE productos
SET precio = CASE
WHEN precio < 50 THEN precio * 1.15
WHEN precio BETWEEN 50 AND 500 THEN precio * 1.10
ELSE precio * 1.05
END
WHERE categoria_id IN (6, 7);Los productos baratos (menos de 50 euros) suben un 15%. Los de precio medio (50-500) suben un 10%. Los caros (más de 500) suben un 5%. Cada fila se evalúa independientemente y recibe el aumento que le corresponde.
Revertir un UPDATE
MySQL no tiene un "deshacer" automático para UPDATE (fuera de transacciones). Si actualizas datos incorrectamente, tendrás que arreglarlo manualmente. Por eso es buena práctica:
Hacer un SELECT con el mismo WHERE antes de ejecutar el UPDATE, para ver qué filas se van a modificar. En operaciones importantes, crear un respaldo de la tabla antes del cambio. Usar transacciones para poder hacer ROLLBACK si algo sale mal (lo veremos en la sección de transacciones).
-- Primero verificar qué filas se afectarán
SELECT id, nombre, precio FROM productos WHERE categoria_id = 6;
-- Si es correcto, ejecutar el UPDATE
UPDATE productos SET precio = precio * 0.95 WHERE categoria_id = 6;Modo seguro
MySQL tiene un modo de seguridad (sql_safe_updates) que impide ejecutar UPDATE sin WHERE o con un WHERE que no use una clave indexada:
SET sql_safe_updates = 1;
-- Esto dará error:
UPDATE productos SET precio = 0;
-- ERROR 1175: You are using safe update mode...Puedes activar este modo en sesiones donde quieras una capa extra de protección contra actualizaciones accidentales.
Practica con UPDATE
Usa el editor para modificar datos y ver el resultado:
En el siguiente artículo veremos cómo combinar UPDATE con JOIN para actualizar filas basándote en datos de otras tablas.
Escrito por Eduardo Lázaro
