En el artículo anterior hemos visto cómo insertar información dentro de cualquier base de datos usando instrucciones SQL estándar. Pero como nada está escrito en piedra, una vez que hayamos introducido la información, casi seguro que tarde o temprano tendremos que actualizarla: un cliente cambia de dirección, se modifica la cantidad de un pedido, un empleado cambia de categoría... Todos estos sucesos implican actualizar información en nuestro modelo de datos. Para ayudarnos con eso, en SQL tenemos la instrucción UPDATE.
Esta instrucción nos permite actualizar los valores de los campos de una tabla, para uno o varios registros, o incluso para todos los registros de una tabla.
Su sintaxis general es:
UPDATE NombreTabla
SET Campo1 = Valor1, ..., CampoN = ValorN
WHERE Condición
Siendo:
- NombreTabla: el nombre de la tabla en la que vamos a actualizar los datos.
- SET: indica los campos que se van a actualizar y con qué valores lo vamos a hacer.
- WHERE: Selecciona los registros de la tabla que se van a actualizar. Se puede aplicar todo lo visto para esta cláusula anteriormente, incluidas las sub-consultas.
Veamos unos ejemplos con la base de datos de ejemplo Northwind en SQL Server (serían idénticos en otros sistemas gestores de bases de datos relacionales como Oracle o MySQL):
1.- Corrige el apellido del empleado con identificador 5. El correcto es "Smith":
UPDATE Employees
SET LastName = 'Smith'
WHERE EmployeeID = 5
2.- Elimina el valor del campo observaciones (Notes) de todos los empleados:
UPDATE Employees
SET Notes = NULL
Nótese como en este caso al carecer de una cláusula WHERE que restrinja la actualización se actualizan todos los registros.
Es muy importante incluir una cláusula WHERE en las instrucciones UPDATE salvo en casos muy concretos como el del ejemplo anterior. De no hacerlo se actualizarán todos los registros de la tabla como acabamos de ver. Es habitual que, por error, se omita esta cláusula y se pierdan datos de forma irreversible (salvo que dispongamos de copias de seguridad o tengamos la posibilidad de hacer un ROLLBACK (cancelación de las instrucciones) si no hemos finalizado la transacción).
3.- Incrementa un 21% el precio de los productos pertenecientes la categoría que tiene el identificador 2:
UPDATE Products
SET UnitPrice = UnitPrice + (UnitPrice * 21 / 100)
WHERE CategoryID = 2
Subconsultas como apoyo a la actualización
Podemos incluir una o varias subconsultas dentro una sentencia UPDATE. Éstas pueden estar contenidas en la cláusula WHERE o formar parte también de la cláusula SET. En este último caso se deben seleccionar el mismo número de campos y con los tipos de datos apropiados, para que cada uno de los valores pueda ser almacenado en la columna que hay a la izquierda del signo igual “=”, entre paréntesis, al lado de la instrucción SET.
Veamos unos ejemplos:
1.- Para todos los productos de la categoría bebidas ('beverages'), de la cual no conocemos su identificador, duplica su precio:
UPDATE Products
SET UnitPrice = UnitPrice * 2
WHERE CategoryID = (SELECT CategoryID FROM Categories
WHERE CategoryName = 'Beverages')
Fíjate en como hemos utilizado una subconsulta en el filtro de modo que se averigua el identificador de la categoría que nos interesa, a partir de su nombre.
2.- Asignar a todos los productos de la categoría bebidas ('beverages'), el mismo precio que tiene el producto con número de identificador (clave primaria) igual a 5:
UPDATE Products
SET UnitPrice = (SELECT UnitPrice FROM Products WHERE ProductID = 5)
WHERE CategoryID = (SELECT CategoryID FROM Categories
WHERE CategoryName = 'Beverages')
En resumen
Con el uso de esta sencilla instrucción UPDATE podemos actualizar cualquier dato o, lo que es más interesante, conjunto de datos que tengamos albergado en cualquier tabla de nuestra base de datos.
La única precaución que debemos tener es la de incluir una clausula WHERE apropiada que verdaderamente cualifique a los datos que queremos actualizar. El principal error en el uso de esta instrucción es precisamente ese, ya que podríamos acabar actualizando los registros equivocados, haciendo mucho daño en la base de datos. Para evitar problemas conviene realizar una consulta de selección precia que nos permita comprobar que las condiciones utilizadas en el WHERE son las apropiadas. También es conveniente tratar de lanzar la actualización dentro de una transacción que nos permita volver atrás todo el proceso en caso de producirse una equivocación y afectar al número equivocado de registros.