Actualización de datos.

La sentencia UPDATE.

    Para la actualización de datos SQL dispone de la sentencia UPDATE. La sentencia UPDATE permite la actualización de uno o varios registros de una única tabla. La sintaxis de la sentencia UPDATE es la siguiente 


UPDATE
 <nombre_tabla>
SET  <campo1> = <valor1>
        {[,<campo2> = <valor2>,...,<campoN> = <valorN>]}
[ WHERE <condicion>];

    Las siguientes sentencias actualizan los datos de la tabla tCoches con los valores de la tabla tMarca obtenidos anteriormente en la página dedicada a la inserción de datos


UPDATE
 tCoches
SET  marca = '1'
WHERE marca = 'FORD';


UPDATE tCoches
SET  marca = '2'
WHERE marca = 'RENAULT';


UPDATE
 tCoches
SET  marca = '3'
WHERE marca = 'SEAT';

    Notese que los valores para el campo marca aparecen entrecomillados, ya que es un campo de tipo varchar. Los valores con los que actualicemos los datos deben ser del tipo del campo.

    Un aspecto a tener en cuenta es que los campos que forman la primary key de una tabla sólo se podrán modificar si los registros no están referenciados en ninguna otra tabla. En nuestro caso sólo podremos modificar la matrícula de un coche si no tiene registros asociados en la tabla tAlquileres.

Esto puede causar poblemas, ya que podríamos habernos equivocado al dar de alta el coche en la tabla tCoches y detectar el error despues de alquilar el coche. En tal caso tendríamos dar de alta un nuevo coche con la matrícula correcta, actualizar los registros de la tabla alquileres y por último borrar el registro erroneo de la tabla tCoches. Este proceso puede ser bastante complicado en el caso de que existiran más relaciones con la tabla. Se podría considerar que la clave primaria de la tabla esta mal definida y que la matrícula no debe ser el elemento que identifique el coche. Una alternativa seria crear un código autonumérico para la tabla tCoches que realizará las veces de clave primaria y crear un índice único para la matrícula, este diseño tambien tiene sus "pegas", por lo que debemos decidir que modelo utilizar, y seleccionar las claves primarias con sumo cuidado.  


Uso de subconsultas con UPDATE

    El uso de subconsultas es una técnica avanzada de consulta que veremos con detalle más adelante, pero que tratamos aquí de forma introductoria.

    Hasta ahora hemos actualizado los datos con valores que conocemos de antemano, ¿pero qué ocurre cuando esos datos deben tomarse de otra tabla de la base de datos?.Podríamos diseñar un programa que recorriera toda la tabla y buscará el valor adecuado para cada registro y lo actualizase. Sin duda es una solución, y en ocasiones casí la única, pero es una solución cara y compleja que además exige que conozcamos algún otro lenguaje de programación. Para estos casos podemos utilizar subconsultas con la sentencia UPDATE

    La sintaxis es la siguiente:


UPDATE
 <nombre_tabla>
SET  <campo1> = <valor1> | <subconsulta1> 
        {[,<campo2> = <valor2> | <subconsulta2>
          ,...
          , <campoN> = <valorN> | <subconsultaN>]}
[ WHERE <condicion>];

   Como puede verse la sintaxis es practicamente igual a la sintaxis del la sentencia UPDATE, con la salvedad de que podemos utilizar subconsultas en lugar de valores al asignar los campos. De forma generica podemos decir que las subconsultas son consultas SELECT incluidas dentro de otra sentencia SQL.

   Las siguientes sentencias UPDATE son equivalentes:


Utilizando sentencias UPDATE normales:
UPDATE tCoches
SET  marca = '1'
WHERE marca = 'FORD';
UPDATE tCoches
SET  marca = '2'
WHERE marca = 'RENAULT';
UPDATE tCoches
SET  marca = '3'
WHERE marca = 'SEAT';
Utilizando sentencias UPDATE combinadas con subconsultas:
UPDATE tCoches
SET  marca = (SELECT CODIGO FROM tMarcas 
              WHERE tMarcas.Marca = tCoches.Marca )
WHERE marca IN ('FORD','RENAULT','SEAT');

    Por cada registro de la tabla tCoches se ejecutará la subconsulta, actualizando el campo marca a el valor del código de la marca en la tabla tMarcas.

    El uso de subconsultas para actualizar datos tiene algunas limitaciones:

  • La subconsulta sólo puede devover un único campo.
  • La subconsulta sólo puede devolver un sólo registro.
  • El tipo de datos devuelto por la subconsulta debe ser del mismo tipo que el campo al que estamos asignando el valor.
  • No todos los sistemas de bases de datos permiten usar subconsultas para actualizar datos (Access) aunque si una buena parte de ellos (ORACLE, SQL Server, Sybase ...)

    Pero en nuestro ejemplo el campo codigo de la tabla tMarcas es numérico y el campo marca de la tabla tCoches es texto. ¿Por qué funciona? Muy facil, el motor de la base de datos es capaz de convertir el valor numérico a un valor texto de forma automática, si bien esta es una excepción.

    Ahora que ya tenemos modificado el valor de la marca de los registros, es conveniente modificar su tipo de datos y crear una foreign key contra la tabla tMarcas. Para ello  ejecutaremos las siguientes sentencias.


ALTER TABLE tCoches
alter column marca int not null;

La opcion alter column es propia de SQL Server. Para modificar el tipo de datos de una tabla debemos consultar la ayuda del gestor de bases de datos. 

ALTER TABLE tCoches
add constraint FK_Coches_Marcas foreign key (marca)
references tMarcas (codigo);

Si no recuerda como modificar tablas o crear foreing key pulse AQUÍ .


Pedro  Herrarte  Sánchez
Actualización de datos. UPDATE
Pedro Herrarte Sánchez

Pedro Herrarte, es consultor independiente, ofreciendo servicios de consultoría, análisis, desarrollo y formación. Posee mas de diez años de experiencia trabajando para las principales empresas de España. Es especialista en tecnologías .NET, entornos Web (ASP.NET, ASP.NET MVC,jQuery, HTML5), bases de datos (SQL Server y ORACLE) e integración de sistemas. Es experto en desarrollo (C#, VB.Net, T-SQL, PL/SQL, , ASP, CGI , C, Pro*C, Java, Essbase, Vignette, PowerBuilder y Visual Basic ...) y bases de datos (SQL Server y ORACLE). Pedro es MCP y MAP 2012, es fundador, diseñador y programador de www.devjoker.com..
Fecha de alta:22/10/2005
Última actualizacion:22/10/2005
Visitas totales:699225
Valorar el contenido:
Últimas consultas realizadas en los foros
Últimas preguntas sin contestar en los foros de devjoker.com