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

SQL Server DELETE:eliminación de una o más filas de una tabla con escenarios ligeramente avanzados

El artículo actual se centra en el uso ligeramente avanzado de la instrucción DELETE para eliminar uno o más registros (filas) de una tabla. Si bien está dirigido principalmente a principiantes, sus consejos pueden ser de ayuda para todos los especialistas en bases de datos.

Requisitos previos:la declaración DELETE Escenarios básicos

Si aún no está familiarizado con los usos básicos de la instrucción Delete, le recomendamos que revise el artículo anterior SQL Server DELETE:eliminar una o más filas de una tabla. Dicho artículo se centra en los siguientes aspectos:

  1. Configuración de una base de datos de muestra.
  2. Ejecución de secuencias de comandos SQL en la base de datos de muestra.
  3. Crear una tabla en una base de datos de muestra e insertar datos en ella.
  4. Eliminar todas las filas de una tabla.
  5. Eliminar una o más filas de una tabla según una condición.
  6. Eliminar una o más filas de una tabla según varias condiciones.

Estos datos son cruciales para comprender antes de pasar al uso ligeramente avanzado de la instrucción Eliminar, por lo tanto, revise ese artículo si no tiene los antecedentes necesarios hasta el momento.

Escenarios ligeramente avanzados para la sentencia DELETE

Al igual que con cualquier otro tutorial, primero debemos configurar una base de datos de muestra para probar la ejecución segura de nuestros scripts.

Un consejo sobre la configuración de la base de datos de muestra

Recomiendo encarecidamente instalar primero SQL Server Developer Edition en su máquina localmente. Es mejor para fines de aprendizaje y evaluación.

Descarga de la edición para desarrolladores de SQL Server

Configurar una base de datos de muestra (WatchesDelSample)

Vamos a configurar una base de datos llamada WatchesDelSample. Esta base de datos contiene las siguientes tres tablas:

  1. Mira.
  2. Color.
  3. Tipo de reloj.

La mesa Watch es la principal. Contiene el nombre, el color y el tipo del reloj. La información sobre el tipo y el color proviene de las dos tablas de referencia Color y Tipo de reloj conectado a través de claves foráneas.

Configure la base de datos de ejemplo con el siguiente script:

-- Create sample database WatchesDelSample
USE MASTER
GO

CREATE DATABASE WatchesDelSample
GO

USE WatchesDelSample

-- Creating a reference table WatchType
CREATE TABLE dbo.WatchType
(
	WatchTypeId INT IDENTITY(1,1),
	Name VARCHAR(50)NOT NULL,
	Detail VARCHAR(200)NULL 
	CONSTRAINT PK_WatchType_WatchTypeId PRIMARY KEY (WatchTypeId)
)
GO

-- Populating (adding rows to the) table WatchType
SET IDENTITY_INSERT dbo.WatchType ON
GO
INSERT INTO dbo.WatchType
(
  WatchTypeId
 ,Name
 ,Detail
)
VALUES
(
  1  -- ID - INT Primary Key
 ,'Analogue' -- Name - varchar(50) NOT NULL
 ,'This is Analogue' -- Detail - varchar(200)
),
(
  2  -- ID - INT Primary Key
 ,'Digital' -- Name - varchar(50) NOT NULL
 ,'This is Digital' -- Detail - varchar(200)
),
(
  3  -- ID - INT Primary Key
 ,'Sports' -- Name - varchar(50) NOT NULL
 ,'This is Sports' -- Detail - varchar(200)
);
GO
SET IDENTITY_INSERT dbo.WatchType OFF
GO

-- Creating a reference table Color
CREATE TABLE dbo.Color
(
	ColorId INT IDENTITY(1,1),
	Name VARCHAR(50)NOT NULL,
	Detail VARCHAR(200)NULL 
	CONSTRAINT PK_Color_ColorId PRIMARY KEY (ColorId)
)
GO

-- Populating (adding rows to the) table Color
SET IDENTITY_INSERT dbo.Color ON
GO
INSERT INTO dbo.Color
(
  ColorId
 ,Name
 ,Detail
)
VALUES
(
  1  -- ID - INT Primary Key
 ,'Black' -- Name - varchar(50) NOT NULL
 ,'This is Black' -- Detail - varchar(200)
),
(
  2  -- ID - INT Primary Key
 ,'White' -- Name - varchar(50) NOT NULL
 ,'This is White' -- Detail - varchar(200)
),
(
  3  -- ID - INT Primary Key
 ,'Blue' -- Name - varchar(50) NOT NULL
 ,'This is Blue' -- Detail - varchar(200)
);
GO
SET IDENTITY_INSERT dbo.Color OFF
GO

-- Creating a table Watch
CREATE TABLE dbo.Watch
(
	WatchId INT IDENTITY(1,1),
	Name VARCHAR(50),
	WatchTypeId INT,
	ColorId INT,
	Price DECIMAL(5,2),		
	CONSTRAINT PK_Watch_WatchId PRIMARY KEY (WatchId)
)
GO

-- Creating foreign key constraint on Watch table to get WatchTypeId values from WatchType table
ALTER TABLE dbo.Watch
    ADD CONSTRAINT [FK_Watch_WatchType_WatchTypeId] 
FOREIGN KEY ([WatchTypeId]) REFERENCES dbo.[WatchType] ([WatchTypeId]);

-- Creating foreign key constraint on Watch table to get ColorId values from Color table
ALTER TABLE dbo.Watch
    ADD CONSTRAINT [FK_Watch_Color_ColorId] 
FOREIGN KEY ([ColorId]) REFERENCES dbo.[Color] ([ColorId]);


-- Populating (adding rows to the) table Watch getting some columns values from reference tables
SET IDENTITY_INSERT WatchesDelSample.dbo.Watch ON
GO
INSERT WatchesDelSample.dbo.Watch(WatchId, Name, WatchTypeId, ColorId, Price) VALUES (1, 'Casio', 1, 1, 100.00)
INSERT WatchesDelSample.dbo.Watch(WatchId, Name, WatchTypeId, ColorId, Price) VALUES (2, 'Timex', 2, 2, 70.00)
GO
SET IDENTITY_INSERT WatchesDelSample.dbo.Watch OFF
GO

Comprobación rápida de datos

Veamos todas las filas del Reloj mesa. Para eso, ejecute el siguiente script:

-- View the watch table data (rows)
SELECT w.WatchId
      ,w.Name
      ,w.WatchTypeId
      ,w.ColorId
      ,w.Price FROM dbo.Watch w

La salida es la siguiente:

Tenga en cuenta que estoy usando dbForge Studio para SQL Server para esta demostración. Sin embargo, puede usar SQL Server Management Studio (SSMS) para ejecutar los mismos scripts; los resultados serán los mismos.

Comprender los ID (códigos) detrás de las columnas Tipo y Color

Como puede ver, hay algunos ID en las siguientes columnas de la tabla de seguimiento:

  1. Id. de tipo de reloj
  2. Id. de color

Estas columnas obtienen valores de las tablas de referencia donde se definieron originalmente. La tabla Watch se conecta a esas tablas de referencia a través de restricciones de clave externa.

Se producen tres problemas con el resultado anterior:

  1. Podemos ver WatchTypeId y ColorId pero no entendemos qué son.
  2. Si entendemos lo que significan estos identificadores, debemos volver a sus tablas originales todo el tiempo para verificar.
  3. Lo más importante, ¿por qué necesitamos obtener el color y el tipo de otras tablas?

Hay una razón por la que definimos Color (ColorId) y Tipo (WatchTypeId) en otras tablas. Necesitamos asegurarnos de que estos valores se mantengan consistentes.

Si no definimos originalmente el valor en las tablas de referencia, podríamos haber mezclado las palabras para representar el color o el tipo. Por ejemplo, podría haber tanto Azul y Blues , o Analógico y Analógico . Para evitar este problema, estandarizamos colores y tipos en tablas de referencia. Luego pasamos sus códigos a la mesa principal.

Al unir la tabla Watch con otras tablas de referencia, podemos recuperar los valores detrás de estos códigos. Es una práctica común en el desarrollo de bases de datos.

Ver la tabla de Vigilancia con los valores de Tipo y Color detrás de los ID

Podemos ver el significado real de los códigos detrás de Color y Tipo ejecutando el siguiente script:

-- View the watch table data (rows)
SELECT w.WatchId
      ,w.Name
      ,wt.Name AS WatchType
      ,c.Name AS ColorName
      ,w.Price FROM dbo.Watch w
  INNER JOIN dbo.Color c ON c.ColorId=w.ColorId
  INNER JOIN dbo.WatchType wt ON w.WatchTypeId = wt.WatchTypeId

El resultado es el siguiente:

Comprender la arquitectura de la base de datos

Necesitamos más información sobre la arquitectura de esta base de datos. Nuestro enfoque está en cómo las tablas se vinculan entre sí.

La imagen de arriba muestra el escenario de las tablas de referencia que ayudan a la tabla principal a recibir datos consistentes. No es un escenario sencillo especialmente para principiantes, aunque es común en muchas bases de datos.

Estamos estudiando esta arquitectura porque necesitamos entender cómo eliminar una o más filas de cualquiera de las tablas anteriores cuando están vinculadas de esta manera.

Eliminar una fila de la tabla de referencia (Color)

¿Podemos eliminar una fila de la tabla de referencia o no? Averigüemos la respuesta.

Eliminamos la primera fila de la tabla Color:

-- Deleting one row with color id 1 from the reference table color 
DELETE FROM Color
WHERE ColorId = 1

El resultado es el siguiente:

El error significa que no está permitido eliminar esa fila que queríamos.

En otras palabras, no podemos eliminar una fila de una tabla a la que otra tabla hace referencia.

Filas vinculadas frente a filas no vinculadas

Dividamos las filas de una tabla de referencia en las siguientes dos categorías:

  1. Filas vinculadas.
  2. Filas no vinculadas.

Una fila vinculada es una fila de una tabla de referencia que utiliza otra tabla. Una fila desvinculada es una fila de una tabla de referencia a la que no apela otra tabla.

Podemos eliminar filas no vinculadas (registros) de una tabla de referencia de inmediato.

Nuestro intento anterior de eliminar una fila de la tabla Color falló porque ese ColorId (1) estaba en uso en la tabla Watch principal.

Ver la tabla de referencia (color)

Veamos la tabla de referencia de la siguiente manera:

-- View reference table Color
SELECT c.ColorId
      ,c.Name
      ,c.Detail FROM dbo.Color c

El conjunto de resultados está a continuación:

De los resultados anteriores, sabemos que el color Azul (ColorId:3) no está en uso en la tabla Watch ya que todavía no hay ningún reloj azul almacenado en la tabla.

Eliminar una fila no vinculada de la tabla de referencia (Color)

Ejecute el siguiente script:

-- Deleting unlinked row with color id 3 from reference table Color
DELETE FROM Color
WHERE ColorId = 3 -- blue color

Hemos eliminado la fila con éxito y podemos confirmarlo viendo la tabla:

--View reference table Color after deleting the unlinked row
SELECT c.ColorId
      ,c.Name
      ,c.Detail FROM dbo.Color c

El conjunto de resultados está a continuación:

Muestra que la fila que contiene el azul el color se ha eliminado correctamente de la tabla.

Un consejo sobre la eliminación de datos de la tabla de referencia

Recuerde que no puede eliminar un registro (fila) de una tabla de referencia si está en uso en otra tabla o grupo de tablas. Sin embargo, puede eliminar un registro de la misma tabla (de referencia) si no está en uso.

Eliminar una fila vinculada de la tabla de referencia (Color)

¿Qué sucede si queremos eliminar una fila de una tabla de referencia sabiendo que pasa los datos de referencia, como los colores, a otra tabla? En otras palabras, ¿cómo eliminamos una fila vinculada de la tabla de referencia?

Primero, debemos eliminar esa fila de la tabla principal donde se hace referencia.

Por ejemplo, podemos eliminar el color Blanco de la tabla de colores de la siguiente manera:

  1. Eliminar todas las filas de la tabla principal (Ver) donde el color es Blanco (basado en la identificación).
  2. Elimine la fila de la tabla de colores de referencia donde el color es blanco (según la identificación).

Ahora, examinémoslo en la práctica.

Eliminar todas las filas donde el color es Blanco de la tabla principal (Reloj)

Nuestro objetivo es eliminar los rastros del blanco color de las tablas principal y de referencia.

Echemos un vistazo a los datos antes de eliminarlos. Queremos verificar cuántas filas de la tabla principal contienen la identificación de color 2 (blanco):

-- View Watch table before deleting rows with white color (color id:2)
 SELECT w.WatchId
       ,w.Name
       ,w.WatchTypeId
       ,w.ColorId
       ,w.Price FROM dbo.Watch w
  WHERE w.ColorId=2 -- White Color

El resultado es el siguiente:

Ahora, elimine las filas que tienen el ID de color 2 ejecutando el siguiente script T-SQL:

-- Deleting all the rows with color id 2 from main table Watch
DELETE FROM dbo.Watch
WHERE ColorId = 2 -- white color 

La salida es la siguiente:

Ver la tabla principal después de eliminar todas las filas con el color blanco

Necesitamos verificar la tabla principal para ver si hay filas que contengan el ID de color 2:

-- View the watch table data (rows)
SELECT w.WatchId
      ,w.Name
      ,wt.Name AS WatchType
      ,w.ColorId 
      ,c.Name AS ColorName
      ,w.Price FROM dbo.Watch w
  INNER JOIN dbo.Color c ON c.ColorId=w.ColorId
  INNER JOIN dbo.WatchType wt ON w.WatchTypeId = wt.WatchTypeId

Como vemos, los registros de los relojes de color blanco están ausentes. Demuestra que hemos eliminado con éxito todas esas filas.

Eliminar una fila previamente vinculada de la tabla de referencia (Color)

Después de eliminar las filas a las que se hace referencia de la tabla principal, también podemos eliminar la fila previamente vinculada de la tabla de referencia. El hecho es que ese vínculo ahora ya no existe.

Ejecute el siguiente script en la tabla de colores de referencia para eliminar la fila con el ID de color 2 (blanco):

-- View reference table before removing color id 1 (white)
SELECT c.ColorId
      ,c.Name
      ,c.Detail FROM dbo.Color c

-- Deleting one row with color id 2 from the reference table color 
DELETE FROM Color
WHERE ColorId = 2 -- White Color

  -- View reference table after removing color id 1 (white)
SELECT c.ColorId
      ,c.Name
      ,c.Detail FROM dbo.Color c

La salida es la siguiente:

¡Felicitaciones!

Hemos aprendido a eliminar una o más filas de una tabla de referencia. Podemos hacerlo tanto si se hace referencia a la fila como si no. Además, hemos examinado la eliminación de filas de la tabla principal.

Un consejo sobre cómo eliminar todos los datos

Hay otra instrucción T-SQL conocida como Truncate Table – es más eficiente para eliminar todos los datos de una tabla. Sin embargo, no se debe hacer referencia a la tabla en ningún otro lugar porque primero debe eliminar los datos de la tabla principal. Es lo mismo que demostramos en este artículo anterior. Luego, aplicaríamos el Truncar declaración contra la tabla de referencia como paso final.

El código es el siguiente:

-- Deleting all rows from the main table using Truncate 
  TRUNCATE TABLE dbo.Watch

Sin embargo, al igual que con la instrucción Eliminar, debe tener mucho cuidado con Truncar , o termina eliminando todos los datos de una tabla.

Palabra de consejo

La eliminación de filas en escenarios en tiempo real nos ayuda principalmente a eliminar datos no deseados (como modelos retirados) de la base de datos principal o a archivar datos y almacenarlos en una base de datos de archivo.

Cosas que hacer

Ahora que puede eliminar una o más filas en escenarios ligeramente avanzados, como tablas vinculadas, intente lo siguiente para mejorar aún más sus habilidades:

  1. Elimine el tipo de reloj analógico de la tabla de referencia WatchType basado en la identificación.
  2. Eliminar todas las filas del Color tabla de referencia.
  3. Intente restablecer la base de datos de muestra y luego vea qué tan rápido puede eliminar todos los datos de todas las tablas (de referencia y principal).