SQL UPDATE: modificar filas existentes
Lección 8.2 · Tiempo de lectura: ~7 min · Tareas de práctica ↓
La sentencia SQL UPDATE modifica valores en filas existentes de una tabla. En esta lección aprenderás la sintaxis UPDATE ... SET ... WHERE, cómo actualizar varias columnas y calcular valores nuevos a partir de los actuales, cómo actualizar filas según otra tabla y cómo asegurarte de que una actualización cambie solo las filas que quieres.
INSERT agrega filas nuevas; UPDATE corrige y mantiene las que ya existen: un cliente cambia su correo, suben los precios, un estado pasa de "activo" a "inactivo". Un UPDATE puede cambiar una fila o millones con una sola sentencia, así que merece el mismo cuidado que DELETE.
Las bases de datos de ejemplo de SQLtest son de solo lectura, así que allí estas sentencias devuelven un error de permisos. Los ejemplos usan el esquema Sakila.
Sintaxis de UPDATE
UPDATE table_name
SET column1 = value1,
column2 = value2
WHERE condition;
UPDATEindica la tabla.SETenumera las columnas y sus valores nuevos.WHEREselecciona las filas a cambiar. SinWHERE, se actualizan todas las filas de la tabla.
Actualizar una fila
UPDATE customer
SET email = 'mary.smith@example.com'
WHERE customer_id = 1;
Resultado: una fila modificada; la condición sobre la clave primaria coincide exactamente con un cliente.
Filtrar por la clave primaria es la forma más segura de cambiar una fila concreta: los nombres pueden repetirse, las claves no.
Actualizar varias columnas
Enumera las asignaciones en SET, separadas por comas:
UPDATE customer
SET first_name = 'ALICE',
last_name = 'COOPER',
email = 'alice.cooper@example.com'
WHERE customer_id = 42;
Resultado: tres columnas del cliente 42 cambiadas en una sola sentencia.
Calcular a partir del valor actual
El lado derecho de SET puede usar el valor actual de la columna:
UPDATE film
SET rental_rate = rental_rate + 1.00
WHERE rating = 'NC-17';
Resultado: la tarifa de alquiler de las 210 películas NC-17 sube $1.
Todas las expresiones de SET usan los valores de antes de la actualización, así que SET a = b, b = a intercambia dos columnas en SQL estándar. MySQL es la excepción: aplica las asignaciones de izquierda a derecha, y las siguientes ya ven los valores nuevos.
Actualizar filas según otra tabla
Para cambiar filas según una condición de otra tabla, usa una subconsulta en WHERE. Subamos un 10% la tarifa de alquiler de todas las comedias:
UPDATE film
SET rental_rate = rental_rate * 1.10
WHERE film_id IN (
SELECT fc.film_id
FROM film_category AS fc
INNER JOIN category AS c ON c.category_id = fc.category_id
WHERE c.name = 'Comedy'
);
Resultado: la tarifa de las 58 comedias sube un 10%.
MySQL y MariaDB no permiten que la subconsulta lea la tabla que se está actualizando: WHERE film_id IN (SELECT f.film_id FROM film f ...) falla con "You can't specify target table 'film' for update in FROM clause". Escribe la subconsulta sobre las otras tablas, como arriba.
MySQL y MariaDB también admiten un UPDATE de varias tablas con JOIN:
UPDATE film AS f
INNER JOIN film_category AS fc ON fc.film_id = f.film_id
INNER JOIN category AS c ON c.category_id = fc.category_id
SET f.rental_rate = f.rental_rate * 1.10
WHERE c.name = 'Comedy';
PostgreSQL usa en cambio UPDATE film SET ... FROM film_category, category WHERE ...; SQL Server usa UPDATE f SET ... FROM film f JOIN ....
Asignar NULL
UPDATE film
SET original_language_id = NULL
WHERE film_id = 10;
Fíjate en la diferencia: SET column = NULL asigna "sin valor", mientras que WHERE column = NULL no coincide con nada; en las condiciones, usa IS NULL.
Revisar antes de actualizar
- Ejecuta un
SELECTcon el mismoWHEREy revisa las filas y su cantidad. - Después ejecuta el
UPDATEy compara la cantidad de "filas afectadas" con el resultado delSELECT.
-- 1. ¿Qué filas van a cambiar?
SELECT film_id, title, rental_rate
FROM film
WHERE rating = 'NC-17';
-- 2. Cambiar exactamente esas filas
UPDATE film
SET rental_rate = rental_rate + 1.00
WHERE rating = 'NC-17';
En producción, ejecuta las actualizaciones importantes dentro de una transacción, para poder deshacer un error. MySQL Workbench y el cliente de MySQL también tienen un modo "safe updates" que rechaza UPDATE y DELETE sin condición sobre una clave.
Conclusiones clave:
UPDATE table SET column = value WHERE conditionmodifica filas existentes.- Sin
WHERE, se cambian todas las filas de la tabla. SETpuede asignar varias columnas y usar sus valores actuales.- Para actualizar según otra tabla, usa una subconsulta en
WHEREo unUPDATEde varias tablas; en MySQL, la subconsulta no puede leer la tabla actualizada. - Revisa primero las filas con
SELECTy compara la cantidad de filas afectadas.
Preguntas frecuentes
¿Qué pasa si ejecuto UPDATE sin WHERE?
Se actualizan todas las filas de la tabla. La única protección es una transacción todavía sin confirmar, un modo safe updates o una copia de seguridad. Revisa siempre la cláusula WHERE antes de ejecutar un UPDATE.
¿Cómo actualizo varias columnas en SQL?
Enuméralas en SET, separadas por comas: UPDATE customer SET first_name = 'ALICE', last_name = 'COOPER' WHERE customer_id = 42;.
¿Cómo actualizo una tabla con valores de otra tabla?
Usa una subconsulta en WHERE o en SET, o una actualización de varias tablas. En MySQL: UPDATE t1 JOIN t2 ON ... SET t1.col = t2.col WHERE ...; en PostgreSQL: UPDATE t1 SET col = t2.col FROM t2 WHERE t1.id = t2.id.