Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL Server DELETE — usuwanie jednego lub więcej wierszy z tabeli w nieco zaawansowanych scenariuszach

Obecny artykuł koncentruje się na nieco zaawansowanym użyciu instrukcji DELETE do usunięcia jednego lub więcej rekordów (wierszy) z tabeli. Chociaż jest skierowany głównie do początkujących, jego wskazówki mogą być pomocne dla wszystkich specjalistów od baz danych.

Warunki wstępne:instrukcja DELETE Scenariusze podstawowe

Jeśli nie znasz jeszcze podstawowych zastosowań instrukcji Delete, zalecamy zapoznanie się z poprzednim artykułem SQL Server DELETE — usuwanie jednego lub więcej wierszy z tabeli. Ten artykuł skupia się na następujących aspektach:

  1. Konfigurowanie przykładowej bazy danych.
  2. Uruchamianie skryptów SQL względem przykładowej bazy danych.
  3. Tworzenie tabeli w przykładowej bazie danych i wstawianie do niej danych.
  4. Usuwanie wszystkich wierszy z tabeli.
  5. Usuwanie jednego lub więcej wierszy z tabeli na podstawie warunku.
  6. Usuwanie jednego lub więcej wierszy z tabeli na podstawie wielu warunków.

Te dane są kluczowe do zrozumienia, zanim przejdziemy do nieco zaawansowanego użycia instrukcji Delete, więc przejrzyj ten artykuł, jeśli nie masz do tej pory niezbędnego tła.

Nieco zaawansowane scenariusze dla instrukcji DELETE

Podobnie jak w przypadku każdego innego przewodnika, musimy najpierw skonfigurować przykładową bazę danych, aby przetestować bezpieczne uruchamianie naszych skryptów.

Wskazówka dotycząca przykładowej konfiguracji bazy danych

Gorąco polecam najpierw lokalną instalację SQL Server Developer Edition na swoim komputerze. Jest lepszy do nauki i testowania.

Pobieranie wersji programistycznej SQL Server

Skonfiguruj przykładową bazę danych (WatchesDelSample)

Stworzymy bazę danych o nazwie WatchesDelSample. Ta baza danych zawiera następujące trzy tabele:

  1. Obejrzyj.
  2. Kolor.
  3. Typ zegarka.

Najważniejsza jest tabela Watch. Zawiera nazwę, kolor i typ zegarka. Informacje o typie i kolorze pochodzą z dwóch tabel referencyjnych Kolor i Typ zegarka połączone za pomocą kluczy obcych.

Skonfiguruj przykładową bazę danych za pomocą następującego skryptu:

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

Szybkie sprawdzanie danych

Zobaczmy wszystkie rzędy Obserwuj stół. W tym celu uruchom następujący skrypt:

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

Dane wyjściowe są następujące:

Zauważ, że do tego demo używam dbForge Studio dla SQL Server. Możesz jednak użyć SQL Server Management Studio (SSMS) do uruchamiania tych samych skryptów – wyniki będą takie same.

Zrozumienie identyfikatorów (kodów) za kolumnami Typ i Kolor

Jak widać, pod następującymi kolumnami tabeli Obserwacja znajduje się kilka identyfikatorów:

  1. Identyfikator typu zegarka
  2. Identyfikator koloru

Te kolumny pobierają wartości z tabel referencyjnych, w których zostały pierwotnie zdefiniowane. Tabela Watch łączy się z tymi tabelami referencyjnymi za pomocą ograniczeń klucza obcego.

Z powyższymi danymi wyjściowymi występują trzy problemy:

  1. Widzimy WatchTypeId i ColorId, ale nie rozumiemy, czym one są.
  2. Jeśli rozumiemy, co oznaczają te identyfikatory, musimy cały czas wracać do ich oryginalnych tabel, aby to sprawdzić.
  3. Co najważniejsze, dlaczego musimy pobrać kolor i typ z innych tabel?

Nie bez powodu zdefiniowaliśmy kolor (ColorId) i typ (WatchTypeId) w innych tabelach. Musimy zapewnić, że wartości te pozostaną spójne.

Jeśli pierwotnie nie zdefiniowaliśmy wartości w tabelach referencyjnych, moglibyśmy pomieszać słowa, aby reprezentować kolor lub typ. Na przykład mogą występować zarówno niebieskie i Blues lub Analogowy i analogowe . Aby uniknąć takiego problemu, standaryzujemy kolory i rodzaje w tabelach referencyjnych. Następnie przekazujemy ich kody do głównej tabeli.

Łącząc tabelę Watch z innymi tabelami referencyjnymi, możemy pobrać wartości za tymi kodami. Jest to powszechna praktyka w tworzeniu baz danych.

Wyświetlanie tabeli obserwacji z wartościami typu i koloru za identyfikatorami

Możemy zobaczyć rzeczywiste znaczenie kodów kolorów i typów, wykonując następujący skrypt:

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

Wynik jest następujący:

Zrozumienie architektury bazy danych

Potrzebujemy więcej informacji o architekturze tej bazy danych. Skupiamy się na tym, jak tabele łączą się ze sobą.

Powyższy obraz przedstawia scenariusz tabel referencyjnych, które pomagają tabeli głównej w otrzymywaniu spójnych danych. Nie jest to prosty scenariusz, zwłaszcza dla początkujących, chociaż jest powszechny w wielu bazach danych.

Badamy tę architekturę, ponieważ musimy zrozumieć, jak usunąć jeden lub więcej wierszy z dowolnej z powyższych tabel, gdy są one połączone w ten sposób.

Usuwanie wiersza z tabeli referencyjnej (kolor)

Czy możemy usunąć wiersz z tabeli referencyjnej, czy nie? Znajdźmy odpowiedź.

Usuwamy pierwszy wiersz z tabeli kolorów:

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

Wynik jest następujący:

Błąd oznacza, że ​​nie można usunąć tego wiersza, który chcieliśmy.

Innymi słowy, nie możemy usunąć wiersza z tabeli, do której odwołuje się inna tabela.

Wiersze połączone a niepołączone

Podzielmy wiersze tabeli referencyjnej na następujące dwie kategorie:

  1. Połączone wiersze.
  2. Niepołączone wiersze.

Połączony wiersz to wiersz tabeli referencyjnej, który jest używany przez inną tabelę. Niepowiązany wiersz to wiersz tabeli referencyjnej, do którego nie odwołuje się inna tabela.

Możemy usunąć niepowiązane wiersze (rekordy) tabeli referencyjnej od razu.

Nasza wcześniejsza próba usunięcia wiersza z tabeli Color nie powiodła się, ponieważ identyfikator ColorId (1) był używany w głównej tabeli Watch.

Wyświetl tabelę referencyjną (kolor)

Spójrzmy na tabelę referencyjną w następujący sposób:

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

Zestaw wyników znajduje się poniżej:

Z poprzednich wyników wiemy, że kolor niebieski (ColorId:3) nie jest używany przez tabelę Watch, ponieważ w tabeli nie ma jeszcze zapisanego niebieskiego zegarka.

Usuwanie niepołączonego wiersza z tabeli referencyjnej (kolor)

Wykonaj następujący skrypt:

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

Pomyślnie usunęliśmy wiersz i możemy to potwierdzić, przeglądając tabelę:

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

Zestaw wyników znajduje się poniżej:

Pokazuje, że wiersz zawierający niebieski kolor został pomyślnie usunięty z tabeli.

Wskazówka dotycząca usuwania danych z tabeli referencyjnej

Pamiętaj, że nie możesz usunąć rekordu (wiersza) z tabeli referencyjnej, jeśli jest on używany przez inną tabelę lub grupę tabel. Możesz jednak usunąć rekord z tej samej (odnośnej) tabeli, jeśli nie jest on używany.

Usuwanie połączonego wiersza z tabeli referencyjnej (kolor)

Co zrobić, jeśli chcemy usunąć wiersz z tabeli referencyjnej, wiedząc, że przekazuje dane referencyjne, takie jak kolory, do innej tabeli? Innymi słowy, jak usunąć połączony wiersz z tabeli referencyjnej?

Najpierw musimy usunąć ten wiersz z głównej tabeli, do której się odwołuje.

Na przykład możemy usunąć kolor Biały z tabeli kolorów w następujący sposób:

  1. Usuń wszystkie wiersze z głównej tabeli (Obserwuj), w których kolorem jest biały (na podstawie identyfikatora).
  2. Usuń wiersz z referencyjnej tabeli kolorów, w której kolorem jest biały (na podstawie identyfikatora).

Teraz przyjrzyjmy się temu w praktyce.

Usuwanie wszystkich wierszy z kolorem białym z tabeli głównej (Obserwuj)

Naszym celem jest usunięcie śladów białej kolor z tabel referencyjnych i głównych.

Rzućmy okiem na dane przed ich usunięciem. Chcemy sprawdzić, ile wierszy z głównej tabeli zawiera identyfikator koloru 2 (biały):

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

Wynik jest poniżej:

Teraz usuń wiersze o identyfikatorze koloru 2, uruchamiając następujący skrypt T-SQL:

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

Dane wyjściowe są następujące:

Wyświetl główną tabelę po usunięciu wszystkich wierszy z białym kolorem

Musimy sprawdzić główną tabelę pod kątem wierszy zawierających identyfikator koloru 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

Jak widzimy, nie ma zapisów dotyczących zegarków w kolorze białym. Dowodzi to, że pomyślnie usunęliśmy wszystkie te wiersze.

Usuwanie wcześniej połączonego wiersza z tabeli referencyjnej (kolor)

Po usunięciu wierszy, do których istnieją odniesienia, z tabeli głównej, możemy również usunąć wiersz wcześniej połączony z tabeli odniesienia. Faktem jest, że tego linku już nie ma.

Uruchom następujący skrypt w odniesieniu do tabeli kolorów odniesienia, aby usunąć wiersz o identyfikatorze koloru 2 (biały):

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

Dane wyjściowe są następujące:

Gratulacje!

Nauczyliśmy się, jak usunąć jeden lub więcej wierszy z tabeli referencyjnej. Możemy to zrobić zarówno w przypadku odniesienia do wiersza, jak i jeśli nie. Przeanalizowaliśmy również usuwanie wierszy z głównej tabeli.

Wskazówka dotycząca usuwania wszystkich danych

Istnieje inna instrukcja T-SQL znana jako Truncate Table – skuteczniej usuwa wszystkie dane z tabeli. Jednak tabela nie może odwoływać się w innym miejscu, ponieważ wtedy musisz najpierw usunąć dane z głównej tabeli. Jest to to samo, co pokazaliśmy w tym artykule wcześniej. Następnie zastosujemy Obcinanie oświadczenie w stosunku do tabeli referencyjnej jako ostatni krok.

Kod wygląda następująco:

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

Jednak, podobnie jak w przypadku instrukcji Delete, musisz bardzo uważać na Obcinanie , lub w końcu usuniesz wszystkie dane z tabeli.

Słowo porady

Usuwanie wierszy w scenariuszach czasu rzeczywistego głównie pomaga nam albo usunąć niechciane dane (takie jak wycofane modele) z głównej bazy danych, albo zarchiwizować dane i przechowywać je w archiwalnej bazie danych.

Rzeczy do zrobienia

Teraz, gdy możesz usunąć jeden lub więcej wierszy w nieco zaawansowanych scenariuszach, takich jak połączone tabele, wypróbuj następujące rzeczy, aby jeszcze bardziej poprawić swoje umiejętności:

  1. Usuń typ zegarka analogowego z tabeli referencyjnej WatchType na podstawie identyfikatora.
  2. Usuń wszystkie wiersze z Koloru tabela referencyjna.
  3. Spróbuj zresetować przykładową bazę danych, a następnie zobacz, jak szybko możesz usunąć wszystkie dane ze wszystkich (referencyjnych i głównych) tabel.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Znajdź jednostki odniesienia w SQL Server:sys.dm_sql_referencing_entities()

  2. Kolumna niepoprawna na liście wyboru, ponieważ nie jest zawarta ani w funkcji agregującej, ani w klauzuli GROUP BY

  3. Pomiń procedurę zapisaną w T-SQL

  4. Czy mogę używać programu ADFS 2.0 do uwierzytelniania niektórych użytkowników w programie SQL Server?

  5. 5 sposobów znajdowania wierszy zawierających wielkie litery w SQL Server