De SQL DROP TABLE-instructie dient om de tabel uit de database te verwijderen. Het verwijdert de tabel en de bijbehorende gegevens en indexen. De verklaring is onomkeerbaar. U kunt de tabel dus alleen herstellen door de back-up te herstellen.
Dit artikel behandelt de volgende gevallen:
- Een of meerdere tabellen verwijderen.
- Verwijder de tabel die in een weergave wordt gebruikt.
- Verwijder de tabel met een externe sleutel.
- Verwijder de tabel met geclusterde en niet-geclusterde indexen.
- Verwijder de tabel uit de replicatie-instellingen.
De syntaxis van de DROP TABLE-instructie is als volgt:
IF EXISTS DROP TABLE [DatabaseName].[SchemaName].[TableName]
Opmerking:als u SQL Server 2016 en hoger gebruikt, kunt u IF EXISTS . opgeven voor de DROP TABLE verklaring.
U geeft ook de tabelnaam op na de DROP TABLE-instructie. Het formaat van de tabelnaam moet [Databasenaam].[Schemanaam].[Tabelnaam] zijn.
Een eenvoudig voorbeeld van de DROP TABLE-instructie
Voor de demonstratie heb ik de AdventureWorks2017 . hersteld database op mijn werkstation. Hier ga ik de werknemers verwijderen tafel.
Gebruik de volgende zoekopdracht om de tabel te verwijderen:
DROP TABLE [AdventureWorks2017].[dbo].[employees]
Ik heb de Devart dbForge SQL Complete tools geïnstalleerd in SQL Server Management Studio. Wanneer ik een SQL DROP TABLE-instructie uitvoer, wordt er een bevestigingsdialoogvenster weergegeven, zoals hieronder weergegeven:
Klik op Toch uitvoeren . De tafel is gevallen.
Voer de volgende query uit om te verifiëren:
SELECT * FROM dbo. employee
Als de tabel met succes is verwijderd, ontvangt u de volgende foutmelding:
Msg 208, Level 16, State 1, Line 1
Invalid object name 'dbo.employee'.
Laat de tabel die in een weergave wordt gebruikt vallen
Hier zullen we proberen een tabel te verwijderen die in een databaseweergave wordt gebruikt. Voer het volgende script uit om een weergave te maken met de naam vPerson :
CREATE VIEW vPerson
AS
SELECT * FROM Person p
Voer de DROP TABLE . uit commando om de Persoon . te verwijderen tafel:
DROP TABLE [AdventureWorks2017].[dbo].[person]
Nadat de tabel is verwijderd, voert u de SELECT-query uit om de gegevens van vPerson te vullen . Het zal een fout produceren:
Msg 208, Level 16, State 1, Procedure vPerson, Line 3 [Batch Start Line 0]
Invalid object name 'Person'.
Msg 4413, Level 16, State 1, Line 1
Could not use the view or function 'vPerson' because of binding errors.
Deze fout treedt op wanneer het object waarvan de weergave afhankelijk is, wordt verwijderd.
Laat de tafel vallen met een externe sleutel
Als u een externe sleutel voor een tabel hebt gemaakt, kunt u de bovenliggende tabel niet verwijderen voordat u de onderliggende tabel verwijdert. Het betekent dat u de onderliggende tabel of de externe sleutel die eerst naar de onderliggende tabel verwijst, moet verwijderen.
Er zijn twee tabellen met de naam tblstudent en tblSchool – het ER-diagram is het volgende:
Opmerking :ik gebruik dbForge Studio voor SQL Server 2019 om een databasediagram te maken - het geeft het juiste inzicht in de tabelstructuur met al zijn elementen en entiteitsrelatie tussen tabellen.
De volgende query maakt de tabellen met de naam tblstudent en tblSchool en hun primaire sleutels en externe sleutels:
CREATE TABLE tblSchool
(
SchoolID INT identity(1,1),
SchoolName VARCHAR(500),
City varchar(250),
CONSTRAINT PK_SchoolID PRIMARY KEY (SchoolID)
)
GO
CREATE TABLE tblStudent
(
StudentID INT IDENTITY(1,1) ,
StudentName VARCHAR(250),
StudentGrade CHAR(1),
SchoolID INT,
CONSTRAINT PK_StudentID PRIMARY KEY (StudentID),
Constraint FK_SchoolID FOREIGN KEY (SchoolID) REFERENCES tblSchool (SchoolID)
)
GO
Voer de volgende query uit om de tblstudent . te verwijderen tafel:
Drop table [tblSchool]
De query retourneert de volgende fout:
Msg 3726, Level 16, State 1, Line 22
Could not drop object 'tblSchool' because it is referenced by a FOREIGN KEY constraint.
Als je in onze demo de tblschool . wilt laten vallen tabel, moet u de tblstudent tafel eerst. Bekijk de vraag om de tblStudent . te verwijderen en tblschool tafel:
Drop table [tblSchool]
Go
Drop table [tblStudent]
Go
Het is ook mogelijk om de batchtabel in een enkele DROP TABLE-instructie neer te zetten. Voer de query als volgt uit:
Drop table [tblSchool], [tblStudent]
Drop een tabel met indexen op
Laten we een ander scenario bekijken van het gedrag van de DROP TABLE-instructie. Stel dat we een tabel hebben gemaakt met de naam tblstudent. Het heeft een geclusterde en een niet-geclusterde index.
Als we een tabel neerzetten met DROP TABLE, worden de indexen dan verwijderd? Laten we het controleren. Ik heb een tabel gemaakt met de naam tblStudent die een geclusterde en een niet-geclusterde index heeft. De vraag is de volgende:
CREATE TABLE tblStudent
(
StudentID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
StudentName VARCHAR(250),
StudentGrade CHAR(1),
SchoolID INT
)
GO
CREATE NONCLUSTERED INDEX IDX_tblStudent_StudentName ON tblStudent(StudentName)
GO
We kunnen de lijst met indexen zien door de sys.indexes . op te vragen DMV.
Nadat de tabel is verwijderd, voert u de volgende query uit:
SELECT Object_name(object_id) AS [Table Name],
NAME AS [Index Name],
type_desc [Index Type]
FROM sys.indexes
WHERE object_id = Object_id('tblStudent')
Uitgang:
Zoals u kunt zien, hebben we zowel de geclusterde als de niet-geclusterde indexen gemaakt voor de tblStudent tafel.
Voer nu de volgende opdracht uit om de tabel te verwijderen:
Drop table tblStudent
Voer opnieuw dezelfde query uit die we hebben gebruikt om de lijst met indexen te vullen:
SELECT Object_name(object_id) AS [Table Name],
NAME AS [Index Name],
type_desc [Index Type]
FROM sys.indexes
WHERE object_id = Object_id('tblStudent')
Uitgang:
De bovenstaande schermafbeelding illustreert dat de query een lege resultatenset heeft geretourneerd. Dus als we een tabel laten vallen, worden ook de indexen verwijderd die aan die tabel zijn gekoppeld.
Een tabel verwijderen uit Replicatie
Stel dat u de tabel wilt verwijderen die deel uitmaakt van replicatie. In dit geval moet u aanvullende stappen uitvoeren.
Ik heb replicatie geconfigureerd tussen de twee exemplaren van SQL Server 2019 genaamd SQL01 en SQL02. Vervolgens heb ik de tblStudent . gerepliceerd en tblSchool tabellen.
We laten de tblSchool-tabel uit de SQL01 vallen door de volgende query uit te voeren:
use codingsight
go
drop table tblSchool
Uitgang:
Msg 3724, Level 16, State 3, Line 3
Cannot drop the table 'tblSchool' because it is being used for replication.
De bovenstaande fout is verklarend. Om de tabel te laten vallen, moeten we deze eerst uit de replicatie verwijderen:
- Open SQL Server Management Studio en maak verbinding met SQL01.
- Uitvouwen Replicatie -> Vouw Lokale publicatie uit .
- Klik met de rechtermuisknop op Publicatie en selecteer Eigenschappen .
In de Publicatie-eigenschappen venster, klik op Artikelen .
Daar ziet u de lijst met tabellen. Haal het vinkje weg bij tblSchool tabel en klik op OK .
Opmerking: Wanneer u het artikel uit de replicatie haalt, worden de vorige snapshots ongeldig. Je moet een nieuwe momentopname genereren nadat je het artikel hebt verwijderd.
Zodra de tabel uit de replicatie is verwijderd, voert u de DROP TABLE . uit commando op SQL01 :
use codingsight
go
drop table tblSchool
Uitgang:
Zoals je kunt zien, is de tafel gevallen.