Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Server DELETE - Suppression d'une ou plusieurs lignes d'une table avec des scénarios légèrement avancés

L'article actuel se concentre sur l'utilisation légèrement avancée de l'instruction DELETE pour supprimer un ou plusieurs enregistrements (lignes) d'une table. Bien qu'il cible principalement les débutants, ses conseils peuvent être utiles à tous les spécialistes des bases de données.

Prérequis :l'instruction DELETE Scénarios de base

Si vous n'êtes pas déjà familiarisé avec les utilisations de base de l'instruction Delete, nous vous recommandons de consulter l'article précédent SQL Server DELETE - Suppression d'une ou plusieurs lignes d'une table. Cet article se concentre sur les aspects suivants :

  1. Configuration d'un exemple de base de données
  2. Exécuter des scripts SQL sur l'exemple de base de données
  3. Créer une table dans un exemple de base de données et y insérer des données
  4. Suppression de toutes les lignes d'un tableau.
  5. Suppression d'une ou plusieurs lignes d'un tableau en fonction d'une condition.
  6. Suppression d'une ou plusieurs lignes d'un tableau en fonction de plusieurs conditions.

Ces données sont cruciales à saisir avant de passer à l'utilisation légèrement avancée de l'instruction Supprimer, alors, relisez cet article si vous n'avez pas encore les connaissances nécessaires.

Scénarios légèrement avancés pour l'instruction DELETE

Comme pour toute autre procédure pas à pas, nous devons d'abord configurer un exemple de base de données pour tester l'exécution de nos scripts en toute sécurité.

Un conseil sur la configuration de la base de données exemple

Je vous recommande vivement d'installer d'abord SQL Server Developer Edition sur votre ordinateur localement. C'est mieux à des fins d'apprentissage et de test.

Téléchargement de l'édition développeur de SQL Server

Configurer un exemple de base de données (WatchesDelSample)

Nous allons mettre en place une base de données appelée WatchesDelSample. Cette base de données contient les trois tables suivantes :

  1. Regarder.
  2. Couleur.
  3. WatchType.

La table Watch est la principale. Il contient le nom, la couleur et le type de la montre. Les informations sur le type et la couleur proviennent des deux tables de référence Couleur et WatchType connecté via des clés étrangères.

Configurez l'exemple de base de données avec le script suivant :

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

Vérification rapide des données

Voyons toutes les lignes de la Watch table. Pour cela, lancez le script suivant :

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

Le résultat est le suivant :

Notez que j'utilise dbForge Studio for SQL Server pour cette démo. Cependant, vous pouvez utiliser SQL Server Management Studio (SSMS) pour exécuter les mêmes scripts - les résultats seront les mêmes.

Comprendre les ID (codes) derrière les colonnes Type et Couleur

Comme vous pouvez le voir, il y a des identifiants sous les colonnes suivantes de la table Watch :

  1. WatchTypeId
  2. ID de couleur

Ces colonnes obtiennent des valeurs des tables de référence dans lesquelles elles ont été définies à l'origine. La table Watch se connecte à ces tables de référence via des contraintes de clé étrangère.

Trois problèmes surviennent avec la sortie ci-dessus :

  1. Nous pouvons voir les WatchTypeId et ColorId mais nous ne comprenons pas ce qu'ils sont.
  2. Si nous comprenons ce que signifient ces identifiants, nous devons revenir à leurs tables d'origine tout le temps pour vérifier.
  3. Plus important encore, pourquoi avons-nous besoin d'obtenir la couleur et le type à partir d'autres tables ?

Il y a une raison pour laquelle nous avons défini Color (ColorId) et Type (WatchTypeId) dans d'autres tables. Nous devons nous assurer que ces valeurs restent cohérentes.

Si nous ne définissons pas à l'origine la valeur dans les tableaux de référence, nous aurions pu mélanger les mots pour représenter la couleur ou le type. Par exemple, il pourrait y avoir à la fois Bleu et les bleus , ou Analogique et Analogique . Pour éviter un tel problème, nous normalisons les couleurs et les types dans des tableaux de référence. Ensuite, nous transmettons leurs codes à la table principale.

En joignant la table Watch avec d'autres tables de référence, nous pouvons récupérer les valeurs derrière ces codes. C'est une pratique courante dans le développement de bases de données.

Affichage du tableau Watch avec les valeurs de type et de couleur derrière les identifiants

Nous pouvons voir la signification réelle des codes derrière Couleur et Type en exécutant le script suivant :

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

Le résultat est le suivant :

Comprendre l'architecture de la base de données

Nous avons besoin de plus d'informations sur l'architecture de cette base de données. Nous nous concentrons sur la manière dont les tables sont liées les unes aux autres.

L'image ci-dessus illustre le scénario des tables de référence aidant la table principale à recevoir des données cohérentes. Ce n'est pas un scénario simple, surtout pour les débutants, bien qu'il soit courant dans de nombreuses bases de données.

Nous étudions cette architecture car nous devons comprendre comment supprimer une ou plusieurs lignes de l'une des tables ci-dessus lorsqu'elles sont liées comme ceci.

Suppression d'une ligne de la table de référence (Couleur)

Peut-on ou non supprimer une ligne de la table de référence ? Laissez-nous trouver la réponse.

Nous supprimons la première ligne de la table des couleurs :

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

Le résultat est le suivant :

L'erreur signifie qu'il n'est pas permis de supprimer la ligne que nous voulions.

En d'autres termes, nous ne pouvons pas supprimer une ligne d'une table référencée par une autre table.

Lignes liées vs lignes non liées

Divisons les lignes d'une table de référence dans les deux catégories suivantes :

  1. Lignes liées.
  2. Lignes non liées.

Une ligne liée est une ligne d'une table de référence utilisée par une autre table. Une ligne non liée est une ligne d'une table de référence à laquelle une autre table ne fait pas appel.

Nous pouvons supprimer immédiatement les lignes non liées (enregistrements) d'une table de référence.

Notre précédente tentative de suppression d'une ligne de la table Color a échoué car ce ColorId (1) utilisait la table Watch principale.

Afficher le tableau de référence (couleur)

Voyons la table de référence comme suit :

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

Le jeu de résultats est ci-dessous :

D'après les sorties précédentes, nous savons que la couleur Bleu (ColorId :3) n'est pas utilisée par la table Watch car il n'y a pas encore de montre bleue stockée dans la table.

Suppression d'une ligne non liée de la table de référence (Couleur)

Exécutez le script suivant :

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

Nous avons supprimé la ligne avec succès et nous pouvons le confirmer en consultant le tableau :

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

Le jeu de résultats est ci-dessous :

Il montre que la ligne contenant le bleu la couleur a bien été supprimée du tableau.

Un conseil sur la suppression des données de la table de référence

N'oubliez pas que vous ne pouvez pas supprimer un enregistrement (ligne) d'une table de référence s'il utilise une autre table ou un groupe de tables. Cependant, vous pouvez supprimer un enregistrement de la même table (de référence) s'il n'est pas utilisé.

Suppression d'une ligne liée de la table de référence (Couleur)

Que se passe-t-il si nous voulons supprimer une ligne d'une table de référence en sachant qu'elle transmet les données de référence telles que les couleurs à une autre table ? En d'autres termes, comment supprimer une ligne liée de la table de référence ?

Tout d'abord, nous devons supprimer cette ligne de la table principale où elle est référencée.

Par exemple, nous pouvons supprimer la couleur Blanc de la table des couleurs comme suit :

  1. Supprimez toutes les lignes du tableau principal (Watch) où la couleur est Blanc (basé sur l'identifiant).
  2. Supprimez la ligne de la table des couleurs de référence où la couleur est Blanc (basé sur l'identifiant).

Maintenant, examinons-le en pratique.

Suppression de toutes les lignes où la couleur est Blanche du tableau principal (Watch)

Notre objectif est d'enlever les traces du blanc couleur des tables de référence et des tables principales.

Examinons les données avant de les supprimer. Nous voulons vérifier combien de lignes de la table principale contiennent l'identifiant de couleur 2 (blanc) :

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

Le résultat est ci-dessous :

Maintenant, supprimez les lignes ayant l'ID de couleur 2 en exécutant le script T-SQL suivant :

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

Le résultat est le suivant :

Afficher le tableau principal après avoir supprimé toutes les lignes de couleur blanche

Nous devons vérifier la table principale pour toutes les lignes contenant l'ID de couleur 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

Comme on le voit, les records pour les montres de couleur blanche sont absents. Cela prouve que nous avons réussi à supprimer toutes ces lignes.

Supprimer une ligne précédemment liée de la table de référence (Couleur)

Après avoir supprimé les lignes référencées de la table principale, nous pouvons également supprimer la ligne précédemment liée de la table de référence. Le fait est que ce lien n'existe plus.

Exécutez le script suivant sur la table des couleurs de référence pour supprimer la ligne avec l'ID de couleur 2 (blanc) :

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

Le résultat est le suivant :

Félicitations !

Nous avons appris à supprimer une ou plusieurs lignes d'une table de référence. Nous pouvons le faire à la fois si la ligne est référencée et sinon. Nous avons également examiné la suppression de lignes de la table principale.

Un conseil sur la suppression de toutes les données

Il existe une autre instruction T-SQL connue sous le nom de Truncate Table – il est plus efficace pour supprimer toutes les données d'une table. Cependant, la table ne doit pas être référencée ailleurs car vous devez d'abord supprimer les données de la table principale. C'est la même chose que nous avons démontré dans cet article plus tôt. Ensuite, nous appliquerions le Tronquer déclaration par rapport à la table de référence comme étape finale.

Le code est le suivant :

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

Cependant, tout comme avec l'instruction Delete, vous devez être très prudent avec Truncate , ou vous finissez par supprimer toutes les données d'une table.

Un conseil

La suppression de lignes dans les scénarios en temps réel nous aide principalement soit à supprimer les données indésirables (telles que les modèles retirés) de la base de données principale, soit à archiver les données et à les stocker dans une base de données d'archivage.

Choses à faire

Maintenant que vous pouvez supprimer une ou plusieurs lignes dans des scénarios légèrement avancés tels que des tableaux liés, essayez les choses suivantes pour améliorer vos compétences :

  1. Supprimez le type de montre analogique de la table de référence WatchType basé sur l'ID.
  2. Supprimer toutes les lignes de la Couleur table de référence.
  3. Essayez de réinitialiser l'exemple de base de données, puis voyez à quelle vitesse vous pouvez supprimer toutes les données de toutes les tables (de référence et principales).