Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server DELETE – Entfernen einer oder mehrerer Zeilen aus einer Tabelle mit leicht fortgeschrittenen Szenarien

Der aktuelle Artikel konzentriert sich auf die leicht fortgeschrittene Verwendung der DELETE-Anweisung, um einen oder mehrere Datensätze (Zeilen) aus einer Tabelle zu entfernen. Während es sich hauptsächlich an Anfänger richtet, können seine Tipps allen Datenbankspezialisten helfen.

Voraussetzungen:die DELETE-Anweisung Basic Scenarios

Wenn Sie mit der grundlegenden Verwendung der Delete-Anweisung noch nicht vertraut sind, empfehlen wir Ihnen, den vorherigen Artikel SQL Server DELETE – Entfernen einer oder mehrerer Zeilen aus einer Tabelle zu lesen. Dieser Artikel konzentriert sich auf die folgenden Aspekte:

  1. Einrichten einer Beispieldatenbank.
  2. Ausführen von SQL-Skripten für die Beispieldatenbank.
  3. Erstellen einer Tabelle in einer Beispieldatenbank und Einfügen von Daten darin.
  4. Alle Zeilen aus einer Tabelle löschen.
  5. Löschen einer oder mehrerer Zeilen aus einer Tabelle basierend auf einer Bedingung.
  6. Löschen einer oder mehrerer Zeilen aus einer Tabelle basierend auf mehreren Bedingungen.

Diese Daten müssen unbedingt erfasst werden, bevor wir zur etwas fortgeschritteneren Verwendung der Delete-Anweisung übergehen. Lesen Sie also diesen Artikel, wenn Sie bisher nicht über die erforderlichen Hintergrundinformationen verfügen.

Etwas fortgeschrittene Szenarien für die DELETE-Anweisung

Wie bei jeder anderen exemplarischen Vorgehensweise müssen wir zuerst eine Beispieldatenbank einrichten, um die sichere Ausführung unserer Skripts damit zu testen.

Ein Tipp zur Einrichtung der Beispieldatenbank

Ich würde dringend empfehlen, die SQL Server Developer Edition zuerst lokal auf Ihrem Computer zu installieren. Es ist besser für Lern- und Testzwecke geeignet.

Herunterladen der SQL Server Developer Edition

Eine Musterdatenbank einrichten (WatchesDelSample)

Wir werden eine Datenbank namens WatchesDelSample einrichten. Diese Datenbank enthält die folgenden drei Tabellen:

  1. Ansehen.
  2. Farbe.
  3. WatchType.

Die Beobachtungstabelle ist die wichtigste. Es enthält den Namen, die Farbe und den Typ der Uhr. Die Informationen zu Typ und Farbe stammen aus den beiden referenzierenden Tabellen Farbe und WatchType über Fremdschlüssel verbunden.

Richten Sie die Beispieldatenbank mit dem folgenden Skript ein:

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

Schneller Datencheck

Lassen Sie uns alle Zeilen der Überwachung anzeigen Tisch. Führen Sie dazu das folgende Skript aus:

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

Die Ausgabe sieht wie folgt aus:

Beachten Sie, dass ich für diese Demo dbForge Studio für SQL Server verwende. Sie können jedoch das SQL Server Management Studio (SSMS) verwenden, um dieselben Skripts auszuführen – die Ergebnisse sind dieselben.

Die IDs (Codes) hinter den Typ- und Farbspalten verstehen

Wie Sie sehen können, gibt es einige IDs unter den folgenden Spalten der Watch-Tabelle:

  1. WatchTypeId
  2. ColorID

Diese Spalten erhalten Werte aus den Referenztabellen, in denen sie ursprünglich definiert wurden. Die Watch-Tabelle ist über Fremdschlüsseleinschränkungen mit diesen Referenztabellen verbunden.

Bei der obigen Ausgabe treten drei Probleme auf:

  1. Wir können die WatchTypeId und ColorId sehen, verstehen aber nicht, was sie sind.
  2. Wenn wir verstehen, was diese IDs bedeuten, müssen wir die ganze Zeit zu ihren ursprünglichen Tabellen zurückkehren, um sie zu überprüfen.
  3. Vor allem, warum müssen wir Farbe und Typ aus anderen Tabellen abrufen?

Es gibt einen Grund, warum wir Farbe (ColorId) und Typ (WatchTypeId) in anderen Tabellen definiert haben. Wir müssen sicherstellen, dass diese Werte konsistent bleiben.

Wenn wir den Wert ursprünglich nicht in den Referenztabellen definieren, könnten wir die Wörter gemischt haben, um die Farbe oder den Typ darzustellen. Beispielsweise könnten beide Blau sein und Blues , oder Analog und Analog . Um ein solches Problem zu vermeiden, standardisieren wir Farben und Typen in Referenztabellen. Dann geben wir ihre Codes an die Haupttabelle weiter.

Indem wir die Watch-Tabelle mit anderen Referenztabellen verbinden, können wir die Werte hinter diesen Codes abrufen. Dies ist eine gängige Praxis in der Datenbankentwicklung.

Anzeigen der Überwachungstabelle mit Typ- und Farbwerten hinter IDs

Wir können die tatsächliche Bedeutung der Codes hinter Farbe und Typ anzeigen, indem wir das folgende Skript ausführen:

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

Das Ergebnis lautet wie folgt:

Die Datenbankarchitektur verstehen

Wir benötigen weitere Informationen über die Architektur dieser Datenbank. Unser Fokus liegt darauf, wie Tabellen miteinander verknüpft sind.

Das obige Bild zeigt das Szenario der Referenztabellen, die der Haupttabelle helfen, konsistente Daten zu erhalten. Dies ist insbesondere für Anfänger kein einfaches Szenario, obwohl es in vielen Datenbanken üblich ist.

Wir untersuchen diese Architektur, weil wir verstehen müssen, wie man eine oder mehrere Zeilen aus einer der obigen Tabellen löscht, wenn sie so verknüpft sind.

Löschen einer Zeile aus der Referenztabelle (Farbe)

Können wir eine Zeile aus der Referenztabelle löschen oder nicht? Lassen Sie uns die Antwort herausfinden.

Wir löschen die erste Zeile aus der Farbtabelle:

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

Das Ergebnis lautet wie folgt:

Der Fehler bedeutet, dass es nicht erlaubt ist, die gewünschte Zeile zu löschen.

Mit anderen Worten, wir können keine Zeile aus einer Tabelle löschen, die von einer anderen Tabelle referenziert wird.

Verknüpfte Zeilen vs. nicht verknüpfte Zeilen

Unterteilen wir die Zeilen einer Referenztabelle in die folgenden zwei Kategorien:

  1. Verknüpfte Zeilen.
  2. Nicht verknüpfte Zeilen.

Eine verknüpfte Zeile ist eine Zeile einer Referenztabelle, die von einer anderen Tabelle verwendet wird. Eine nicht verknüpfte Zeile ist eine Zeile einer Referenztabelle, die von einer anderen Tabelle nicht angesprochen wird.

Wir können nicht verknüpfte Zeilen (Datensätze) einer Referenztabelle sofort löschen.

Unser früherer Versuch, eine Zeile aus der Farbtabelle zu löschen, schlug fehl, weil diese Farb-ID (1) von der Hauptüberwachungstabelle verwendet wurde.

Sehen Sie sich die Referenztabelle an (Farbe)

Betrachten wir die Referenztabelle wie folgt:

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

Die Ergebnismenge ist unten:

Aus den vorherigen Ausgaben wissen wir, dass die Farbe Blau (ColorId:3) von der Watch-Tabelle nicht verwendet wird, da noch keine blaue Uhr in der Tabelle gespeichert ist.

Löschen einer nicht verknüpften Zeile aus der Referenztabelle (Farbe)

Führen Sie das folgende Skript aus:

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

Wir haben die Zeile erfolgreich gelöscht und können dies anhand der Tabelle bestätigen:

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

Die Ergebnismenge ist unten:

Es zeigt, dass die Zeile mit dem blauen Farbe wurde erfolgreich aus der Tabelle entfernt.

Ein Tipp zur Datenentfernung aus der Referenztabelle

Denken Sie daran, dass Sie keinen Datensatz (Zeile) aus einer Referenztabelle löschen können, wenn diese von einer anderen Tabelle oder Tabellengruppe verwendet wird. Sie können jedoch einen Datensatz aus derselben (Referenz-)Tabelle löschen, wenn er nicht verwendet wird.

Löschen einer verknüpften Zeile aus der Referenztabelle (Farbe)

Was ist, wenn wir eine Zeile aus einer Referenztabelle entfernen möchten und wissen, dass sie die Referenzdaten wie Farben an eine andere Tabelle übergibt? Mit anderen Worten, wie löschen wir eine verknüpfte Zeile aus der Referenztabelle?

Zuerst müssen wir diese Zeile aus der Haupttabelle löschen, in der sie referenziert wird.

Beispielsweise können wir die Farbe Weiß löschen aus der Farbtabelle wie folgt:

  1. Löschen Sie alle Zeilen aus der Haupttabelle (Watch), in denen die Farbe Weiß ist (basierend auf der ID).
  2. Löschen Sie die Zeile aus der Referenz-Farbtabelle, in der die Farbe Weiß ist (basierend auf der ID).

Lassen Sie es uns nun in der Praxis untersuchen.

Löschen aller Zeilen, in denen die Farbe Weiß ist, aus der Haupttabelle (Überwachung)

Unser Ziel ist es, die Spuren des Weißen zu beseitigen Farbe aus Referenz- und Haupttabellen.

Sehen wir uns die Daten an, bevor Sie sie löschen. Wir wollen prüfen, wie viele Zeilen der Haupttabelle die Farb-ID 2 (weiß) enthalten:

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

Das Ergebnis ist unten:

Löschen Sie nun die Zeilen mit der Farb-ID 2, indem Sie das folgende T-SQL-Skript ausführen:

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

Die Ausgabe sieht wie folgt aus:

Zeigen Sie die Haupttabelle an, nachdem Sie alle Zeilen mit der weißen Farbe entfernt haben

Wir müssen die Haupttabelle auf Zeilen überprüfen, die die Farb-ID 2 enthalten:

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

Wie wir sehen, fehlen die Aufzeichnungen für die weißen Farbuhren. Es beweist, dass wir alle diese Zeilen erfolgreich gelöscht haben.

Löschen einer zuvor verknüpften Zeile aus der Referenztabelle (Farbe)

Nachdem wir die referenzierten Zeilen aus der Haupttabelle entfernt haben, können wir auch die zuvor verknüpfte Zeile aus der Referenztabelle entfernen. Tatsache ist, dass dieser Link jetzt nicht mehr da ist.

Führen Sie das folgende Skript für die Referenz-Farbtabelle aus, um die Zeile mit der Farb-ID 2 (Weiß) zu löschen:

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

Die Ausgabe sieht wie folgt aus:

Herzlichen Glückwunsch!

Wir haben gelernt, wie man eine oder mehrere Zeilen aus einer Referenztabelle entfernt. Wir können dies sowohl tun, wenn auf die Zeile verwiesen wird, als auch wenn nicht. Außerdem haben wir das Löschen von Zeilen aus der Haupttabelle untersucht.

Ein Tipp zum Löschen aller Daten

Es gibt eine weitere T-SQL-Anweisung, die als Truncate Table bekannt ist – Es ist effizienter, alle Daten aus einer Tabelle zu entfernen. Allerdings darf die Tabelle nicht anderweitig referenziert werden, da Sie dann erst die Daten aus der Haupttabelle löschen müssen. Es ist das gleiche, was wir zuvor in diesem Artikel gezeigt haben. Dann würden wir das Truncate anwenden Anweisung gegen die Referenztabelle als letzten Schritt.

Der Code lautet wie folgt:

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

Genau wie bei der Delete-Anweisung müssen Sie jedoch bei Truncate sehr vorsichtig sein , oder Sie löschen am Ende alle Daten aus einer Tabelle.

Ratschlag

Das Löschen von Zeilen in Echtzeitszenarien hilft uns meistens dabei, entweder unerwünschte Daten (z. B. ausgemusterte Modelle) aus der Hauptdatenbank zu entfernen oder Daten zu archivieren und in einer Archivdatenbank zu speichern.

Dinge zu tun

Da Sie nun eine oder mehrere Zeilen in leicht fortgeschrittenen Szenarien wie verknüpften Tabellen löschen können, versuchen Sie Folgendes, um Ihre Fähigkeiten weiter zu verbessern:

  1. Löschen Sie den analogen Uhrentyp aus der Referenztabelle WatchType basierend auf der ID.
  2. Löschen Sie alle Zeilen aus der Farbe Referenztabelle.
  3. Versuchen Sie, die Beispieldatenbank zurückzusetzen, und sehen Sie dann, wie schnell Sie alle Daten aus allen (Referenz- und Haupt-)Tabellen löschen können.