sql >> Base de Datos >  >> RDS >> Sqlserver

Las mejores formas de usar la instrucción SQL DELETE en una tabla SQL

En las bases de datos relacionales, creamos tablas para almacenar datos en varios formatos. SQL Server almacena datos en un formato de fila y columna que contiene un valor asociado con cada tipo de datos. Cuando diseñamos tablas SQL, definimos tipos de datos como entero, flotante, decimal, varchar y bit. Por ejemplo, una tabla que almacena datos de clientes puede tener campos como nombre de cliente, correo electrónico, dirección, estado, país, etc. Varios comandos SQL se ejecutan en una tabla SQL y se pueden dividir en las siguientes categorías:

  • Lenguaje de definición de datos (DDL):  Estos comandos se utilizan para crear y modificar los objetos de base de datos en una base de datos.
    • Crear:  Crea objetos
    • Alterar:  Modifica objetos
    • Soltar:  Elimina objetos
    • Truncar:  Elimina todos los datos de una tabla
  • Lenguaje de manipulación de datos (DML):  Estos comandos insertan, recuperan, modifican, eliminan y actualizan datos en la base de datos.
    • Seleccione:  Recupera datos de una tabla única o múltiple
    • Insertar:  Agrega nuevos datos en una tabla
    • Actualización:  Modifica los datos existentes
    • Eliminar:  Elimina registros existentes en una tabla

  • Lenguaje de control de datos (DCL):  Estos comandos están asociados con controles de derechos o permisos en una base de datos.
    • Concesión:  Asigna permisos a un usuario
    • Revocar:  Revoca permisos de un usuario
  • Lenguaje de control de transacciones (TCL):  Estos comandos controlan las transacciones en una base de datos.
    • Compromiso:  Guarda los cambios realizados por la consulta
    • Restaurar: Revierte una transacción explícita o implícita al comienzo de la transacción, o a un punto de guardado dentro de la transacción
    • Guardar transacciones:  Establece un punto de guardado o marcador dentro de una transacción

Suponga que tiene datos de pedidos de clientes almacenados en una tabla SQL. Si siguiera insertando datos en esta tabla continuamente, la tabla podría contener millones de registros, lo que podría causar problemas de rendimiento dentro de sus aplicaciones. El mantenimiento de su índice también puede consumir mucho tiempo. A menudo, no es necesario conservar pedidos que tengan más de tres años. En estos casos, podría eliminar esos registros de la tabla. Esto ahorraría espacio de almacenamiento y reduciría los esfuerzos de mantenimiento.

Puede eliminar datos de una tabla SQL de dos formas:

  • Uso de una declaración de eliminación de SQL
  • Usando un truncado

Veremos la diferencia entre estos comandos SQL más adelante. Primero exploremos la declaración de eliminación de SQL.

Una declaración de eliminación de SQL sin ninguna condición

En las declaraciones de lenguaje de manipulación de datos (DML), una declaración de eliminación de SQL elimina las filas de una tabla. Puede eliminar una fila específica o todas las filas. Una instrucción de eliminación básica no requiere ningún argumento.

Vamos a crear una tabla SQL de pedidos usando el siguiente script. Esta tabla tiene tres columnas [ID de pedido], [Nombre de producto] y [Cantidad de producto].

Create Table Orders (   OrderID int, ProductName varchar(50), ProductQuantity int )

Inserte algunos registros en esta tabla.

Insert into Orders values (1,'ABC books',10), (2,'XYZ',100), (3,'SQL book',50)

Ahora, supongamos que queremos eliminar los datos de la tabla. Puede especificar el nombre de la tabla para eliminar datos mediante la declaración de eliminación. Ambas declaraciones SQL son iguales. Podemos especificar el nombre de la tabla a partir de la palabra clave (opcional) o especificar el nombre de la tabla directamente después de la eliminación.

Delete Orders Go Delete from Orders GO

Una declaración de eliminación de SQL con datos filtrados

Estas declaraciones de eliminación de SQL eliminan todos los datos de la tabla. Por lo general, no eliminamos todas las filas de una tabla SQL. Para eliminar una fila específica, podemos agregar una cláusula where con la declaración de eliminación. La cláusula where contiene los criterios de filtro y eventualmente determina qué fila(s) eliminar.

Por ejemplo, supongamos que queremos eliminar el ID de pedido 1. Una vez que agregamos una cláusula where, SQL Server primero verifica las filas correspondientes y elimina esas filas específicas.
Delete Orders where orderid=1

Si la condición de la cláusula where es falsa, no elimina ninguna fila. Por ejemplo, eliminamos el pedido 1 de la tabla de pedidos. Si ejecutamos la declaración nuevamente, no encuentra ninguna fila para satisfacer la condición de la cláusula where. En este caso, devuelve 0 filas afectadas.

Declaración de eliminación de SQL y cláusula TOP

También puede usar la instrucción TOP para eliminar las filas. Por ejemplo, la siguiente consulta elimina las 100 primeras filas de la tabla Pedidos.

Delete top (100) [OrderID] from Orders

Como no hemos especificado ningún 'ORDENAR POR', elige filas aleatorias y las elimina. Podemos utilizar la cláusula Ordenar por para ordenar los datos y eliminar las filas superiores. En la siguiente consulta, ordena el [ID de pedido] en orden descendente y luego lo elimina de la tabla [Pedidos].

Delete from Orders where [OrderID] In ( Select top 100 [OrderID] FROM Orders order by [OrderID] Desc )

Eliminar filas basadas en otra tabla

A veces necesitamos eliminar filas basadas en otra tabla. Esta tabla puede existir en la misma base de datos o no.

  • Búsqueda de tabla

Podemos usar el método de búsqueda de tablas o la combinación SQL para eliminar estas filas. Por ejemplo, queremos eliminar filas de la tabla [Pedidos] que cumplan la siguiente condición:

Debe tener las filas correspondientes en la tabla [dbo].[Cliente].

Mire la consulta a continuación, aquí tenemos una declaración de selección en la cláusula where de la declaración de eliminación. SQL Server primero obtiene las filas que satisfacen la declaración de selección y luego elimina esas filas de la tabla [Pedidos] usando la declaración de eliminación de SQL.

Delete Orders where orderid in (Select orderid  from Customer)
  • Unión SQL

Alternativamente, podemos usar uniones SQL entre estas tablas y eliminar las filas. En la siguiente consulta, unimos las tablas [Pedidos]] con la tabla [Cliente]. Una unión SQL siempre funciona en una columna común entre las tablas. Tenemos una columna [OrderID] que une ambas tablas.

DELETE Orders FROM Orders o INNER JOIN Customer c ON o.orderid=c.orderid

Para comprender la declaración de eliminación anterior, veamos el plan de ejecución real.

Según el plan de ejecución, realiza un escaneo de tablas en ambas tablas, obtiene los datos coincidentes y los elimina de la tabla de pedidos.

  • Expresión de tabla común (CTE)

También podemos usar una expresión de tabla común (CTE) para eliminar las filas de una tabla SQL. Primero, definimos un CTE para encontrar la fila que queremos eliminar.

Luego, unimos el CTE con la tabla SQL Orders y borramos las filas.

WITH cteOrders AS (SELECT OrderID FROM Customer WHERE CustomerID = 1 ) DELETE Orders FROM cteOrders sp INNER JOIN dbo.Orders o ON o.orderid = sp.orderid;

Impactos en el rango de identidad

Las columnas de identidad en SQL Server generan valores secuenciales únicos para su columna. Se utilizan principalmente para identificar de forma única una fila en la tabla SQL. Una columna de clave principal también es una buena opción para un índice agrupado en SQL Server.

En el siguiente script, tenemos una tabla [Empleado]. Esta tabla tiene una identificación de columna de identidad.

Create Table Employee ( id int identity(1,1), [Name] varchar(50) )

Insertamos 50 registros en esta tabla que generaron los valores de identidad para la columna id.

Declare @id int=1 While(@id<=50) BEGIN Insert into Employee([Name]) values('Test'+CONVERT(VARCHAR,@ID)) Set @id=@id+1 END

Si eliminamos algunas filas de la tabla SQL, no restablece los valores de identidad para los valores posteriores. Por ejemplo, eliminemos algunas filas que tienen valores de identidad de 20 a 25.

Delete from employee where id between 20 and 25

Ahora, vea los registros de la tabla.

Select * from employee where id>15

Muestra la brecha en el rango de valores de identidad.

Declaración de eliminación de SQL y el registro de transacciones

La eliminación de SQL registra cada eliminación de fila en el registro de transacciones. Suponga que necesita eliminar millones de registros de una tabla SQL. No desea eliminar una gran cantidad de registros en una sola transacción porque podría hacer que su archivo de registro crezca exponencialmente y que su base de datos tampoco esté disponible. Si cancela una transacción en el medio, podría llevar horas revertir una declaración de eliminación.

En este caso, siempre debe eliminar filas en pequeños fragmentos y confirmar esos fragmentos con regularidad. Por ejemplo, puede eliminar un lote de 10 000 filas a la vez, confirmarlo y pasar al siguiente lote. Cuando SQL Server confirma el fragmento, se puede controlar el crecimiento del registro de transacciones.

 Mejores prácticas

  • Siempre debe realizar una copia de seguridad antes de eliminar datos.
  • De forma predeterminada, SQL Server utiliza transacciones implícitas y confirma los registros sin consultar al usuario. Como práctica recomendada, debe iniciar una transacción explícita mediante Comenzar transacción. Le da el control para confirmar o revertir la transacción. También debe ejecutar copias de seguridad frecuentes del registro de transacciones si su base de datos está en modo de recuperación completa.
  • Desea eliminar datos en pequeños fragmentos para evitar un uso excesivo del registro de transacciones. También evita bloqueos para otras transacciones SQL.
  • Debe restringir los permisos para que los usuarios no puedan eliminar datos. Solo los usuarios autorizados deben tener acceso para eliminar datos de una tabla SQL.
  • Desea ejecutar la declaración de eliminación con una cláusula where. Elimina datos filtrados de una tabla SQL. Si su aplicación requiere la eliminación frecuente de datos, es una buena idea restablecer los valores de identidad periódicamente. De lo contrario, podría enfrentar problemas de agotamiento del valor de identidad.
  • En caso de que desee vaciar la tabla, es recomendable utilizar la sentencia truncada. La declaración truncada elimina todos los datos de una tabla, utiliza un registro mínimo de transacciones, restablece el rango de valores de identidad y es más rápida que la declaración de eliminación de SQL porque desasigna todas las páginas de la tabla inmediatamente.
  • En caso de que utilice restricciones de clave externa (relación padre-hijo) para sus tablas, debe eliminar la fila de una fila secundaria y luego de la tabla principal. Si elimina la fila de la fila principal, también puede usar la opción de eliminación en cascada para eliminar automáticamente la fila de una tabla secundaria. Puede consultar el artículo: Eliminar cascada y actualizar cascada en clave externa de SQL Server para obtener más información.
  • Si usa la declaración superior para eliminar las filas, SQL Server elimina las filas al azar. Siempre debe usar la cláusula superior con la cláusula Ordenar por y Agrupar por correspondiente.
  • Una declaración de eliminación adquiere un bloqueo de intención exclusivo en la tabla de referencia; por lo tanto, durante ese tiempo, ninguna otra transacción puede modificar los datos. Puede usar la sugerencia NOLOCK para leer los datos.
  • Debe evitar usar la sugerencia de tabla para anular el comportamiento de bloqueo predeterminado de la declaración de eliminación de SQL; solo debe ser utilizado por administradores de bases de datos y desarrolladores experimentados.

Consideraciones importantes

Hay muchos beneficios de usar declaraciones de eliminación de SQL para eliminar datos de una tabla de SQL, pero como puede ver, requiere un enfoque metódico. Es importante eliminar siempre los datos en lotes pequeños y proceder con precaución al eliminar datos de una instancia de producción. Tener una estrategia de respaldo para recuperar datos en la cantidad mínima de tiempo es imprescindible para evitar el tiempo de inactividad o futuros impactos en el rendimiento.