En SQL, la sentencia UPDATE se utiliza para modificar o actualizar los registros existentes en una tabla. La sentencia SQL UPDATE se utiliza para actualizar los datos existentes en la base de datos. Se considera un comando de manipulación de datos SQL. En este artículo, examinaremos la sintaxis de la sentencia UPDATE con gran detalle.
Sintaxis Básica de la Sentencia UPDATE
La estructura de la sentencia UPDATE tiene una estructura bastante simple. A continuación, se presenta la sintaxis general:
UPDATESET = , = , ...[WHERE ];
En esta sintaxis, se dice la tabla que se quiere actualizar a través de <Nombre_Tabla>, los valores que se quieren aplicar mediante el uso de SET y en base a una condición evaluada mediante la cláusula WHERE.
Componentes de la Sentencia UPDATE
La sentencia UPDATE se compone de varias cláusulas y opciones que permiten un control preciso sobre la operación de actualización.
Cláusula SET
Puede especificar las columnas que desea actualizar utilizando la palabra clave SET. Es importante que tengamos cuidado al hacer uso de UPDATE, porque un mal uso puede ser bastante nocivo. Al establecer los valores de sus columnas, debe utilizar el tipo de datos correcto.
Lea también: IVA 21% Excel
- column_name: Es una columna que contiene los datos que se van a cambiar. column_name debe existir en table_or_view_name.
- expression: Es una variable, un valor literal, una expresión o una instrucción de subselección entre paréntesis que devuelve un solo valor.
Cláusula WHERE
La última parte de la sintaxis es la inclusión opcional de la cláusula WHERE. Especifica las condiciones que limitan las filas que se actualizan. La condición de búsqueda también puede ser la condición en la que se basa una combinación. No hay límite en el número de predicados que se pueden incluir en una condición de búsqueda. Aunque es opcional, a menudo es una buena práctica incluir siempre WHERE en las sentencias UPDATE.
Opciones y Cláusulas Avanzadas de UPDATE
Cláusula TOP
TOP <expresión> [ % ]: Permite especificar el porcentaje de filas que se deben actualizar con la ejecución del comando UPDATE. En ocasiones, en vez de porcentaje se utiliza un número, indicando de esta manera, el número de filas a actualizar. Especifica el número o porcentaje de filas que se va a actualizar. Se requieren paréntesis que delimitan la expresión en TOP en INSERT, UPDATE, y DELETE en sentencias.
Cuando se usa una cláusula TOP (n) con UPDATE, la operación de actualización se realiza sobre una selección aleatoria de 'n' número de filas. Si debe usar TOP para aplicar actualizaciones por orden cronológico, debe utilizarla junto con ORDER BY en una instrucción de subselección.
Cláusula FROM
Especifica que se utiliza un origen de tabla, vista o tabla derivada para proporcionar los criterios de la operación de actualización. Si el objeto que se actualiza es el que se indica en la cláusula FROM y solo hay una referencia al objeto en ella, puede especificarse o no un alias de objeto. Si el objeto que se actualiza aparece más de una vez en la cláusula FROM, una única referencia al objeto no debe especificar un alias de tabla. Actúe con precaución al especificar la cláusula FROM para proporcionar los criterios de la operación de actualización. Los resultados de una UPDATE sentencia no están definidos si la sentencia incluye una cláusula FROM que no está especificada de tal manera que solo haya un valor disponible por cada ocurrencia de columna que se actualice, es decir, si la UPDATE sentencia no es determinista.
Cláusula WITH (Sugerencias de tabla)
WITH (<Sugerencia_de_tabla_limitada>): Permite especificar una o varias sugerencias de tablas permitidas en una tabla de destino. Especifica una o varias sugerencias de tabla que están permitidas en una tabla de destino. La palabra clave WITH y los paréntesis son obligatorios. NOLOCK, READUNCOMMITTED, NOEXPAND y otros no están permitidos.
Lea también: Guía IVA reducido
Uso de DEFAULT
DEFAULT: Permite especificar que el valor predeterminado definido para la columna debe reemplazar al valor existente en esa columna. Especifica que el valor predeterminado definido para la columna debe reemplazar al valor existente en esa columna.
Cláusula OUTPUT
Devuelve datos actualizados o expresiones basadas en ellos como parte de la UPDATE operación. La cláusula OUTPUT no se admite en ninguna instrucción DML que tenga como destino tablas o vistas remotas.
Actualizaciones Parciales con .WRITE()
.WRITE (expresión, desplazamiento, longitud): Especifica que se va a modificar una sección del valor de column_name. Solo se pueden especificar con esta cláusula columnas de tipo varchar(max), nvarchar(max) o varbinary(max). expression es el valor que se copia en column_name. expression se debe evaluar, o bien se debe poder convertir implícitamente al tipo column_name. desplazamiento es una posición de bytes ordinal basada en cero, es bigint y no puede ser un número negativo. longitud es bigint y no puede ser un número negativo. Las actualizaciones .WRITE que insertan o anexan datos nuevos se registran mínimamente si se ha establecido para la base de datos el modelo de recuperación optimizado para cargas masivas de registros o el modelo de recuperación simple. El registro mínimo no se usa cuando se actualizan los valores existentes.
Actualizaciones Posicionadas con WHERE CURRENT OF
Una actualización posicionada que utiliza una cláusula WHERE CURRENT OF actualiza la fila que se encuentra en la posición actual del cursor. Este método puede ser más preciso que una actualización por búsqueda que use una cláusula WHERE <search_condition> para calificar las filas que se deben actualizar. Es el nombre del cursor abierto desde el que se debe realizar la captura. Si hay un cursor global y otro local con el nombre cursor_name, este argumento hace referencia al cursor global si se especifica GLOBAL; de lo contrario, hace referencia al cursor local. Es el nombre de una variable de cursor.
Permisos y Mejores Prácticas
Para que se puedan ejecutar sentencias de UPDATE sobre una tabla, esta debe tener concedidos los permisos de UPDATE sobre dicha tabla, de lo contrario se impedirá hacer la actualización. Se requieren permisos UPDATE en la tabla de destino. Los permisos UPDATE por defecto corresponden a los miembros del rol fijo de servidor sysadmin, los roles fijos de base de datos db_owner y db_datawriter, así como al propietario de la tabla.
Lea también: ¿Cómo localizar tus XML del SAT?
Es una buena práctica utilizar SELECT para ver los registros antes de proceder a actualizarlos. Si el registro devuelto es efectivamente el que desea modificar, puede utilizar la misma cláusula WHERE para su sentencia UPDATE. Por ejemplo, en MySQL te encontrarás con el mensaje: "Estás utilizando el modo de actualización seguro y has intentado actualizar una tabla sin un WHERE que utiliza una columna KEY.
Una sentencia UPDATE adquiere un bloqueo exclusivo (X) en cualquier fila que modifique y mantiene estos bloqueos hasta que la transacción se completa. Dependiendo del plan de consulta para la sentencia UPDATE, el número de filas que se modifiquen y el nivel de aislamiento de la transacción, los bloqueos pueden adquirirse a nivel de página o tabla en lugar de a nivel de fila. Para impedir que estos bloqueos de nivel superior se produzcan, considere la posibilidad de dividir en lotes las instrucciones UPDATE que afecten a miles de filas o más, y asegúrese de que los índices admitan las condiciones de combinación y de filtro. Si el bloqueo optimizado está habilitado, algunos aspectos del comportamiento de bloqueo para UPDATE cambiar. Por ejemplo, los bloqueos exclusivos (X) no se mantienen hasta que se completa la transacción.
Consideraciones Especiales en la Sentencia UPDATE
Actualización de Campos FILESTREAM
Puedes usar la sentencia UPDATE para actualizar un campo FILESTREAM a un valor nulo, un valor vacío o una cantidad relativamente pequeña de datos en línea. Sin embargo, se envía una gran cantidad de datos de manera más eficaz en un archivo si se utilizan interfaces de Win32. Al actualizar un campo FILESTREAM, modifica los datos de BLOB subyacentes en el sistema de archivos. Cuando un campo FILESTREAM está establecido en NULL, se eliminan los datos de BLOB asociados al campo. No se puede usar .WRITE() para realizar actualizaciones parciales en los datos FILESTREAM.
Manejo de Errores Aritméticos
Cuando una sentencia UPDATE encuentra un error aritmético (desbordamiento, división por cero o error de dominio) durante la evaluación de expression, la actualización no se realiza.
Disparadores (Triggers)
Cuando se define un disparador INSTEAD OF en UPDATE acciones contra una tabla, el disparador se ejecuta en lugar de la sentencia UPDATE. Las versiones anteriores de SQL Server solo soportan disparadores AFTER definidos en UPDATE y otras sentencias de modificación de datos. La cláusula FROM no puede especificarse en una UPDATE sentencia que haga referencia, directa o indirectamente, a una vista con un INSTEAD OF disparador definido.
Expresiones de Tabla Comunes (CTE)
Especifica el conjunto de resultados o vista temporal nombrada, también conocida como expresión de tabla común (CTE), definida dentro del alcance de la UPDATE sentencia. Las expresiones de tablas comunes también pueden usarse con las sentencias SELECT, INSERT, DELETE, y CREATE VIEW. Cuando una expresión común de tabla (CTE) es el objetivo de una UPDATE afirmación, todas las referencias a la CTE en la instrucción deben coincidir.
UPDATE x -- cte is referenced by the alias.FROM cte AS x -- cte is assigned an alias.
Se requieren referencias CTE inequívocas porque un CTE no tiene un identificador de objeto, que SQL Server usa para reconocer la relación implícita entre un objeto y su alias. Sin esta relación, el plan de consulta puede producir un comportamiento de la unión inesperado y resultados imprevistos de la consulta.
Tipos de Datos Obsoletos
Los tipos de datos ntext, text e image se quitarán en una versión futura de SQL Server. Evite su uso en nuevos trabajos de desarrollo y piense en modificar las aplicaciones que los usan actualmente.
Configuración de ANSI_PADDING
Si ANSI_PADDING está configurado en OFF, todos los espacios finales se eliminan de los datos insertados en las columnas varchar y nvarchar, excepto en cadenas que contienen solo espacios. Estas cadenas se truncan en una cadena vacía. Si ANSI_PADDING está configurado en ON, se insertan espacios finales. El controlador ODBC de Microsoft SQL Server y el proveedor OLE DB Provider para SQL Server se activan ANSI_PADDING automáticamente para cada conexión. Se puede configurar en orígenes de datos ODBC o mediante atributos o propiedades de conexión.
Actualizaciones en Servidores Remotos
En el ejemplo siguiente se actualiza una tabla en un servidor remoto. En el ejemplo primero se crea un vínculo al origen de datos remoto mediante sp_addlinkedserver. El nombre del servidor vinculado, MyLinkedServer, se especifica después como parte del nombre de objeto de cuatro partes con el formato servidor.catálogo.esquema.objeto.
También se puede actualizar una fila de una tabla remota mediante la especificación de la función de conjunto de filas OPENQUERY o OPENDATASOURCE. Especifique un nombre de servidor válido para el origen de datos con el formato server_name o server_name\instance_name.
Ejemplos Prácticos de UPDATE
Ejemplo Básico de Actualización
Imaginemos que tenemos una tabla que contiene el nombre y la edad de los empleados de una empresa. La consulta actualiza el nombre de un empleado a Juan: aquel en el que el id de ese empleado es igual a 1. El valor 3 de employee_id corresponde a Paul Johnson. Sólo hay una ocurrencia de 3 en la columna employee_id, por lo que esta consulta no actualizará ningún otro registro.
UPDATE EmployeesSET FirstName = 'Juan'WHERE EmployeeID = 1;
Para nuestro siguiente empleado, vamos a actualizar su edad utilizando su first_name y last_name en la cláusula WHERE.
UPDATE EmployeesSET Age = 35WHERE FirstName = 'Ana' AND LastName = 'García';
Actualización de Varias Filas y Recuperación de Errores
Imaginemos un escenario en el que alguien estuviera actualizando registros en la tabla employees y comete un error. Accidentalmente, puso en las 5 primeras filas el nombre "Juan". Por suerte, tenemos una tabla de reserva que no se ha visto afectada por el error del desarrollador. Vamos a escribir una consulta que actualice los valores incorrectos de los empleados con los valores correctos de la tabla de respaldo.
UPDATE eSET e.FirstName = eb.FirstNameFROM Employees AS eJOIN Employees_Backup AS eb ON e.LastName = eb.LastNameWHERE e.EmployeeID < 6;
Aquí, la única columna que queremos modificar es first_name, pero sólo cuando el employee_id de ese registro es menor que 6. A continuación, seleccionamos los valores de la columna first_name de la tabla employees_backup, haciendo coincidir los empleados con su apellido. Este es un escenario útil para tener en cuenta; algo similar puede ocurrir cuando se trabaja con bases de datos.
Actualización con Subconsulta en la Cláusula SET
El siguiente ejemplo utiliza una subconsulta en la cláusula SET para determinar el valor que se utiliza para actualizar la columna. La subconsulta debe devolver solo un valor escalar. Es decir, un solo valor por fila. En el ejemplo se modifica la columna SalesYTD de la tabla SalesPerson para reflejar las ventas más recientes registradas en la tabla SalesOrderHeader.
UPDATE Sales.SalesPersonSET SalesYTD = ( SELECT SUM(soh.TotalDue) FROM Sales.SalesOrderHeader AS soh WHERE soh.SalesPersonID = SalesPerson.BusinessEntityID)WHERE SalesPerson.BusinessEntityID IS NOT NULL;
Este ejemplo asume que solo se registra una venta para un determinado vendedor en una fecha determinada y que las actualizaciones son recientes. Si se puede registrar más de una venta para un vendedor especificado en el mismo día, el ejemplo que se muestra no funciona correctamente. Se ejecuta sin errores, pero cada valor de SalesYTD se actualiza con una sola venta, independientemente del número de ventas que se produjeron ese día realmente.
Actualización a Través de una Vista
En el siguiente ejemplo se actualizan las filas de la tabla especificando una vista como el objeto de destino. La definición de vista hace referencia a varias tablas, sin embargo, la sentencia UPDATE tiene éxito porque solo hace referencia a columnas de una de las tablas subyacentes. La sentencia UPDATE fallaría si se especificaban columnas de ambas tablas.
CREATE VIEW vw_ProductScrapASSELECT ScrapReasonID, NameFROM Production.ScrapReason;GOUPDATE vw_ProductScrapSET Name = 'Bad Material'WHERE ScrapReasonID = 1;
Actualización de una Tabla Remota con OPENQUERY
En el ejemplo siguiente se actualiza una fila de una tabla remota mediante la especificación de la función de conjunto de filas OPENQUERY.
UPDATE OPENQUERY (MyLinkedServer, 'SELECT Name FROM Production.Product WHERE ProductID = 1')SET Name = 'NewProductName';
