Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL Server DELETE – Rimozione di una o più righe da una tabella con scenari leggermente avanzati

L'articolo corrente è incentrato sull'utilizzo leggermente avanzato dell'istruzione DELETE per rimuovere uno o più record (righe) da una tabella. Sebbene si rivolga principalmente ai principianti, i suoi suggerimenti possono essere di aiuto a tutti gli specialisti di database.

Prerequisiti:l'istruzione DELETE Scenari di base

Se non hai già familiarità con gli usi di base dell'istruzione Delete, ti consigliamo di rivedere l'articolo precedente SQL Server DELETE – Rimozione di una o più righe da una tabella. Questo articolo si concentra sui seguenti aspetti:

  1. Impostazione di un database di esempio.
  2. Esecuzione di script SQL sul database di esempio.
  3. Creazione di una tabella in un database di esempio e inserimento di dati in esso.
  4. Eliminazione di tutte le righe da una tabella.
  5. Eliminazione di una o più righe da una tabella in base a una condizione.
  6. Eliminazione di una o più righe da una tabella in base a più condizioni.

Questi dati sono fondamentali da comprendere prima di passare all'uso leggermente avanzato dell'istruzione Elimina, quindi, se non disponi delle conoscenze necessarie finora, consulta l'articolo.

Scenari leggermente avanzati per l'istruzione DELETE

Come per qualsiasi altra procedura dettagliata, dobbiamo prima configurare un database di esempio per testare l'esecuzione dei nostri script in modo sicuro.

Un suggerimento sulla configurazione del database di esempio

Consiglio vivamente di installare prima la SQL Server Developer Edition sul computer in locale. È meglio per scopi di apprendimento e test.

Download dell'edizione per sviluppatori di SQL Server

Imposta un database di esempio (WatchesDelSample)

Creeremo un database chiamato WatchesDelSample. Questo database contiene le tre tabelle seguenti:

  1. Guarda.
  2. Colore.
  3. Tipo orologio.

La tabella Watch è quella principale. Contiene il nome, il colore e il tipo dell'orologio. Le informazioni sul tipo e sul colore provengono dalle due tabelle di riferimento Colore e WatchType connesso tramite chiavi esterne.

Configura il database di esempio con il seguente 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

Controllo rapido dei dati

Vediamo tutte le righe dell'Orologio tavolo. Per questo, esegui il seguente script:

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

L'output è il seguente:

Nota che sto usando dbForge Studio per SQL Server per questa demo. Tuttavia, puoi utilizzare SQL Server Management Studio (SSMS) per eseguire gli stessi script:i risultati saranno gli stessi.

Comprendere gli ID (codici) dietro le colonne Tipo e Colore

Come puoi vedere, ci sono alcuni ID sotto le seguenti colonne della tabella Watch:

  1. WatchTypeId
  2. ColorId

Queste colonne ottengono valori dalle tabelle di riferimento in cui sono state originariamente definite. La tabella Watch si collega a tali tabelle di riferimento tramite vincoli di chiave esterna.

Si verificano tre problemi con l'output di cui sopra:

  1. Possiamo vedere WatchTypeId e ColorId ma non capiamo cosa siano.
  2. Se capiamo cosa significano questi ID, dobbiamo sempre tornare alle loro tabelle originali per controllare.
  3. Soprattutto, perché abbiamo bisogno di ottenere Colore e Tipo da altre tabelle?

C'è un motivo per cui abbiamo definito Color (ColorId) e Type (WatchTypeId) in altre tabelle. Dobbiamo garantire che questi valori rimangano coerenti.

Se non definissimo originariamente il valore nelle tabelle di riferimento, avremmo potuto mescolare le parole per rappresentare il colore o il tipo. Ad esempio, potrebbero esserci entrambi Blu e Blues o Analogico e Analogico . Per evitare un tale problema, standardizziamo colori e tipi nelle tabelle di riferimento. Quindi trasmettiamo i loro codici alla tabella principale.

Unendo la tabella Watch con altre tabelle di riferimento, possiamo recuperare i valori dietro questi codici. È una pratica comune nello sviluppo di database.

Visualizzazione della tabella Watch con i valori Tipo e Colore dietro gli ID

Possiamo visualizzare il significato effettivo dei codici dietro Colore e Tipo eseguendo il seguente 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

Il risultato è il seguente:

Capire l'architettura del database

Abbiamo bisogno di maggiori informazioni sull'architettura di questo database. Il nostro focus è sul modo in cui le tabelle si collegano tra loro.

L'immagine sopra mostra lo scenario delle tabelle di riferimento che aiutano la tabella principale a ricevere dati coerenti. Non è uno scenario semplice soprattutto per i principianti, sebbene sia comune in molti database.

Stiamo studiando questa architettura perché dobbiamo capire come eliminare una o più righe da una qualsiasi delle tabelle sopra quando sono collegate in questo modo.

Eliminazione di una riga dalla tabella di riferimento (Colore)

Possiamo eliminare una riga dalla tabella di riferimento o no? Scopriamo la risposta.

Cancelliamo la prima riga dalla Tabella dei colori:

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

Il risultato è il seguente:

L'errore significa che non è consentito eliminare la riga che volevamo.

In altre parole, non possiamo eliminare una riga da una tabella a cui fa riferimento un'altra tabella.

Righe collegate e righe non collegate

Dividiamo le righe di una tabella di riferimento nelle seguenti due categorie:

  1. Righe collegate.
  2. Righe non collegate.

Una riga collegata è una riga di una tabella di riferimento utilizzata da un'altra tabella. Una riga non collegata è una riga di una tabella di riferimento a cui un'altra tabella non fa appello.

Possiamo eliminare immediatamente le righe (record) non collegate di una tabella di riferimento.

Il nostro precedente tentativo di eliminare una riga dalla tabella dei colori non è riuscito perché quel ColorId (1) era in uso nella tabella principale di controllo.

Visualizza la tabella di riferimento (colore)

Vediamo la tabella di riferimento come segue:

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

Il set di risultati è il seguente:

Dalle uscite precedenti, sappiamo che il colore Blue (ColorId:3) non è utilizzato dalla tabella Watch poiché nella tabella non è ancora stato memorizzato alcun orologio blu.

Eliminazione di una riga non collegata dalla tabella di riferimento (Colore)

Esegui il seguente script:

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

Abbiamo eliminato la riga con successo e possiamo confermarlo visualizzando la tabella:

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

Il set di risultati è il seguente:

Mostra che la riga contenente il blu il colore è stato rimosso con successo dalla tabella.

Un consiglio sulla rimozione dei dati dalla tabella di riferimento

Ricorda che non puoi eliminare un record (riga) da una tabella di riferimento se è in uso un'altra tabella o gruppo di tabelle. Tuttavia, puoi eliminare un record dalla stessa tabella (di riferimento) se non è in uso.

Eliminazione di una riga collegata dalla tabella di riferimento (Colore)

Cosa succede se vogliamo rimuovere una riga da una tabella di riferimento sapendo che passa i dati di riferimento come i colori a un'altra tabella? In altre parole, come si elimina una riga collegata dalla tabella di riferimento?

Innanzitutto, dobbiamo eliminare quella riga dalla tabella principale a cui fa riferimento.

Ad esempio, possiamo eliminare il colore Bianco dalla tabella dei colori come segue:

  1. Elimina tutte le righe dalla tabella principale (Guarda) in cui il colore è bianco (in base all'id).
  2. Elimina la riga dalla tabella dei colori di riferimento in cui il colore è bianco (in base all'id).

Ora, esaminiamolo in pratica.

Eliminazione di tutte le righe in cui il colore è bianco dalla tabella principale (Guarda)

Il nostro obiettivo è rimuovere le tracce del bianco colore sia dalle tabelle di riferimento che da quelle principali.

Diamo un'occhiata ai dati prima di eliminarli. Vogliamo controllare quante righe della tabella principale contengono il color id 2 (bianco):

-- 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

Il risultato è il seguente:

Ora, elimina le righe con ID colore 2 eseguendo il seguente script T-SQL:

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

L'output è il seguente:

Visualizza la tabella principale dopo aver rimosso tutte le righe con il colore bianco

Dobbiamo controllare la tabella principale per eventuali righe contenenti color id 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

Come si vede, i record per gli orologi di colore bianco sono assenti. Dimostra che abbiamo eliminato con successo tutte quelle righe.

Eliminazione di una riga precedentemente collegata dalla tabella di riferimento (Colore)

Dopo aver rimosso le righe di riferimento dalla tabella principale, possiamo anche rimuovere la riga precedentemente collegata dalla tabella di riferimento. Il fatto è che quel link ora non c'è più.

Eseguire lo script seguente sulla tabella dei colori di riferimento per eliminare la riga con l'ID colore 2 (bianco):

-- 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

L'output è il seguente:

Congratulazioni!

Abbiamo imparato come rimuovere una o più righe da una tabella di riferimento. Possiamo farlo sia se si fa riferimento alla riga che in caso contrario. Inoltre, abbiamo esaminato l'eliminazione di righe dalla tabella principale.

Un consiglio sull'eliminazione di tutti i dati

Esiste un'altra istruzione T-SQL nota come Troncate Table – è più efficiente per rimuovere tutti i dati da una tabella. Tuttavia, la tabella non deve essere referenziata altrove perché quindi è necessario eliminare prima i dati dalla tabella principale. È lo stesso che abbiamo dimostrato in questo articolo in precedenza. Quindi, applicheremmo il troncamento dichiarazione contro la tabella di riferimento come passaggio finale.

Il codice è il seguente:

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

Tuttavia, proprio come con l'istruzione Delete, devi stare molto attento con Troncate o finisci per eliminare tutti i dati da una tabella.

Parola di consiglio

L'eliminazione delle righe in scenari in tempo reale ci aiuta principalmente a rimuovere i dati indesiderati (come i modelli ritirati) dal database principale o ad archiviare i dati e archiviarli in un database di archivio.

Cose da fare

Ora che puoi eliminare una o più righe in scenari leggermente avanzati come le tabelle collegate, prova le seguenti cose per migliorare ulteriormente le tue abilità:

  1. Elimina il tipo di orologio analogico dalla tabella di riferimento WatchType in base all'ID.
  2. Elimina tutte le righe dal Colore tabella di riferimento.
  3. Prova a reimpostare il database di esempio e poi vedi quanto velocemente puoi eliminare tutti i dati da tutte le tabelle (di riferimento e principali).