Het huidige artikel richt zich op enigszins geavanceerd gebruik van de DELETE-instructie om een of meer records (rijen) uit een tabel te verwijderen. Hoewel het vooral gericht is op beginners, kunnen de tips nuttig zijn voor alle databasespecialisten.
Vereisten:de DELETE-instructie Basisscenario's
Als u niet al bekend bent met het basisgebruik van de Delete-instructie, raden we u aan het vorige artikel SQL Server DELETE - Een of meer rijen uit een tabel verwijderen te lezen. Dat artikel richt zich op de volgende aspecten:
- Een voorbeelddatabase opzetten.
- SQL-scripts uitvoeren op de voorbeelddatabase.
- Een tabel maken in een voorbeelddatabase en er gegevens in invoegen.
- Alle rijen uit een tabel verwijderen.
- Een of meer rijen uit een tabel verwijderen op basis van een voorwaarde.
- Een of meer rijen uit een tabel verwijderen op basis van meerdere voorwaarden.
Deze gegevens zijn cruciaal om te begrijpen voordat we overgaan tot het enigszins geavanceerde gebruik van de Delete-instructie, dus lees dat artikel door als u tot nu toe niet over de benodigde achtergrond beschikt.
Enigszins geavanceerde scenario's voor de DELETE-instructie
Zoals bij elke andere oplossing, moeten we eerst een voorbeelddatabase opzetten om te testen of onze scripts er veilig op kunnen worden uitgevoerd.
Een tip over het instellen van de voorbeelddatabase
Ik raad u ten zeerste aan om eerst de SQL Server Developer Edition lokaal op uw computer te installeren. Het is beter voor leer- en testdoeleinden.
SQL Server-ontwikkelaarseditie downloaden
Een voorbeelddatabase instellen (WatchesDelSample)
We gaan een database opzetten met de naam WatchesDelSample. Deze database bevat de volgende drie tabellen:
- Kijk.
- Kleur.
- HorlogeType.
De Watch-tafel is de belangrijkste. Het bevat de naam, kleur en type van het horloge. De informatie over zowel type als kleur komt uit de twee referentietabellen Kleur en WatchType verbonden via externe sleutels.
Stel de voorbeelddatabase in met het volgende 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
Snelle gegevenscontrole
Laten we alle rijen van de Watch . bekijken tafel. Voer daarvoor het volgende script uit:
-- View the watch table data (rows)
SELECT w.WatchId
,w.Name
,w.WatchTypeId
,w.ColorId
,w.Price FROM dbo.Watch w
De uitvoer is als volgt:
Merk op dat ik dbForge Studio voor SQL Server gebruik voor deze demo. U kunt echter de SQL Server Management Studio (SSMS) gebruiken om dezelfde scripts uit te voeren - de resultaten zullen hetzelfde zijn.
De ID's (codes) achter de kolommen Type en Color begrijpen
Zoals u kunt zien, zijn er enkele ID's onder de volgende kolommen van de Watch-tabel:
- WatchTypeId
- ColorId
Deze kolommen krijgen waarden uit de referentietabellen waarin ze oorspronkelijk zijn gedefinieerd. De Watch-tabel maakt verbinding met die referentietabellen via externe sleutelbeperkingen.
Er doen zich drie problemen voor met de bovenstaande uitvoer:
- We kunnen de WatchTypeId en ColorId zien, maar we begrijpen niet wat ze zijn.
- Als we begrijpen wat deze id's betekenen, moeten we de hele tijd teruggaan naar hun oorspronkelijke tabellen om te controleren.
- Het belangrijkste is:waarom moeten we Kleur en Type uit andere tabellen halen?
Er is een reden waarom we Color (ColorId) en Type (WatchTypeId) in andere tabellen hebben gedefinieerd. We moeten ervoor zorgen dat deze waarden consistent blijven.
Als we de waarde oorspronkelijk niet definiëren in de referentietabellen, hadden we de woorden kunnen mengen om de kleur of het type weer te geven. Er kunnen bijvoorbeeld beide Blauw . zijn en Blues , of Analoog en Analoog . Om een dergelijk probleem te voorkomen, standaardiseren we kleuren en soorten in referentietabellen. Dan geven we hun codes door aan de hoofdtafel.
Door de Watch-tabel samen te voegen met andere referentietabellen, kunnen we de waarden achter deze codes achterhalen. Het is een gangbare praktijk bij het ontwikkelen van databases.
De Watch-tabel bekijken met Type- en Kleurwaarden achter ID's
We kunnen de werkelijke betekenis van de codes achter Kleur en Type bekijken door het volgende script uit te voeren:
-- 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
Het resultaat is als volgt:
De database-architectuur begrijpen
We hebben meer informatie nodig over de architectuur van deze database. Onze focus ligt op hoe tabellen aan elkaar linken.
De bovenstaande afbeelding toont het scenario van de referentietabellen die de hoofdtabel helpen om consistente gegevens te ontvangen. Het is geen eenvoudig scenario, vooral niet voor beginners, hoewel het in veel databases gebruikelijk is.
We bestuderen deze architectuur omdat we moeten begrijpen hoe we een of meer rijen uit een van de bovenstaande tabellen kunnen verwijderen als ze op deze manier zijn gekoppeld.
Een rij verwijderen uit de referentietabel (kleur)
Kunnen we een rij uit de referentietabel verwijderen of niet? Laten we het antwoord vinden.
We verwijderen de eerste rij uit de kleurentabel:
-- Deleting one row with color id 1 from the reference table color
DELETE FROM Color
WHERE ColorId = 1
Het resultaat is als volgt:
De fout betekent dat het niet is toegestaan om die rij te verwijderen die we wilden.
Met andere woorden, we kunnen geen rij verwijderen uit een tabel waarnaar wordt verwezen door een andere tabel.
Gekoppelde rijen versus niet-gekoppelde rijen
Laten we de rijen van een referentietabel in de volgende twee categorieën verdelen:
- Gekoppelde rijen.
- Ongelinkte rijen.
Een gekoppelde rij is een rij van een referentietabel die door een andere tabel wordt gebruikt. Een niet-gekoppelde rij is een rij van een referentietabel waar een andere tabel geen beroep op doet.
We kunnen niet-gekoppelde rijen (records) van een referentietabel meteen verwijderen.
Onze eerdere poging om een rij uit de Color-tabel te verwijderen, mislukte omdat die ColorId (1) in gebruik was van de hoofdtabel voor Watch.
Bekijk de referentietabel (kleur)
Laten we de referentietabel als volgt bekijken:
-- View reference table Color
SELECT c.ColorId
,c.Name
,c.Detail FROM dbo.Color c
De resultatenset staat hieronder:
Uit de vorige outputs weten we dat de kleur Blauw (ColorId:3) niet in gebruik is door de Watch-tabel, omdat er nog geen blauw horloge in de tabel is opgeslagen.
Een niet-gekoppelde rij verwijderen uit de referentietabel (kleur)
Voer het volgende script uit:
-- Deleting unlinked row with color id 3 from reference table Color
DELETE FROM Color
WHERE ColorId = 3 -- blue color
We hebben de rij met succes verwijderd en we kunnen dit bevestigen door de tabel te bekijken:
--View reference table Color after deleting the unlinked row
SELECT c.ColorId
,c.Name
,c.Detail FROM dbo.Color c
De resultatenset staat hieronder:
Het laat zien dat de rij met de blauwe kleur is succesvol van de tafel verwijderd.
Een tip over het verwijderen van gegevens uit de referentietabel
Onthoud dat u een record (rij) niet uit een referentietabel kunt verwijderen als deze in gebruik is van een andere tabel of groep tabellen. U kunt echter een record uit dezelfde (referentie)tabel verwijderen als deze niet in gebruik is.
Een gekoppelde rij verwijderen uit de referentietabel (kleur)
Wat als we een rij uit een referentietabel willen verwijderen, wetende dat deze de referentiegegevens, zoals kleuren, doorgeeft aan een andere tabel? Met andere woorden, hoe verwijderen we een gekoppelde rij uit de referentietabel?
Eerst moeten we die rij verwijderen uit de hoofdtabel waarin ernaar wordt verwezen.
We kunnen bijvoorbeeld de kleur Wit delete verwijderen uit de kleurentabel als volgt:
- Verwijder alle rijen uit de hoofdtabel (Watch) waar de kleur Wit is (gebaseerd op id).
- Verwijder de rij uit de referentiekleurentabel waar de kleur Wit is (gebaseerd op id).
Laten we het nu in de praktijk onderzoeken.
Alle rijen verwijderen waar de kleur Wit is van de hoofdtabel (Bekijk)
Ons doel is om de sporen van de witte . te verwijderen kleur uit zowel referentie- als hoofdtabellen.
Laten we de gegevens eens bekijken voordat we deze verwijderen. We willen controleren hoeveel rijen van de hoofdtabel de kleur id 2 (wit) bevatten:
-- 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
Het resultaat is hieronder:
Verwijder nu de rijen met kleur-id 2 door het volgende T-SQL-script uit te voeren:
-- Deleting all the rows with color id 2 from main table Watch
DELETE FROM dbo.Watch
WHERE ColorId = 2 -- white color
De uitvoer is als volgt:
Bekijk de hoofdtabel na het verwijderen van alle rijen met de witte kleur
We moeten de hoofdtabel controleren op rijen met kleur-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
Zoals we zien, ontbreken de records voor de witte horloges. Het bewijst dat we met succes al die rijen hebben verwijderd.
Een eerder gekoppelde rij verwijderen uit de referentietabel (Kleur)
Nadat we de rijen waarnaar wordt verwezen uit de hoofdtabel hebben verwijderd, kunnen we ook de eerder gekoppelde rij uit de referentietabel verwijderen. Feit is dat die link er nu niet meer is.
Voer het volgende script uit tegen de referentiekleurtabel om de rij met de kleur-id 2 (wit) te verwijderen:
-- 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
De uitvoer is als volgt:
Gefeliciteerd!
We hebben geleerd hoe u een of meer rijen uit een referentietabel kunt verwijderen. We kunnen het zowel doen als er naar de rij wordt verwezen en als dat niet het geval is. We hebben ook gekeken naar het verwijderen van rijen uit de hoofdtabel.
Een tip over het verwijderen van alle gegevens
Er is nog een T-SQL-instructie die bekend staat als Truncate Table – het is efficiënter om alle gegevens uit een tabel te verwijderen. Er mag echter niet ergens anders naar de tabel worden verwezen, omdat u dan eerst de gegevens uit de hoofdtabel moet verwijderen. Het is hetzelfde als we eerder in dit artikel hebben aangetoond. Vervolgens passen we de Truncate . toe statement tegen de referentietabel als laatste stap.
De code is als volgt:
-- Deleting all rows from the main table using Truncate
TRUNCATE TABLE dbo.Watch
Echter, net als bij de Delete-instructie, moet je heel voorzichtig zijn met Truncate , of je verwijdert uiteindelijk alle gegevens uit een tabel.
Advies
Het verwijderen van rijen in realtime scenario's helpt ons meestal om ongewenste gegevens (zoals verouderde modellen) uit de hoofddatabase te verwijderen of om gegevens te archiveren en op te slaan in een archiefdatabase.
Dingen om te doen
Nu u een of meer rijen kunt verwijderen in enigszins geavanceerde scenario's, zoals gekoppelde tabellen, kunt u het volgende proberen om uw vaardigheden verder te verbeteren:
- Verwijder het analoge horlogetype uit de referentietabel WatchType gebaseerd op de ID.
- Verwijder alle rijen uit de Kleur referentietabel.
- Probeer de voorbeelddatabase opnieuw in te stellen en kijk hoe snel u alle gegevens uit alle (referentie- en hoofd)tabellen kunt verwijderen.