SQL DROP TABLE-satsen tjänar till att ta bort tabellen från databasen. Den tar bort tabellen och dess data och index som är associerade med den. Uttalandet är oåterkalleligt. Således kan du återställa tabellen endast genom att återställa säkerhetskopian.
Den här artikeln täcker följande fall:
- Ta bort en eller flera tabeller.
- Ta bort tabellen som används i en vy.
- Ta bort tabellen med en främmande nyckel.
- Ta bort tabellen med klustrade och icke-klustrade index.
- Ta bort tabellen från replikeringsinställningarna.
Syntaxen för DROP TABLE-satsen är följande:
IF EXISTS DROP TABLE [DatabaseName].[SchemaName].[TableName]
Obs! Om du använder SQL Server 2016 och senare kan du ange OM FINNS före SLIPTABELL uttalande.
Du anger också tabellnamnet efter DROP TABLE-satsen. Tabellnamnsformatet ska vara [Databasnamn].[Schemanamn].[Tabellnamn].
Ett enkelt exempel på DROP TABLE-satsen
För demonstrationen har jag återställt AdventureWorks2017 databas på min arbetsstation. Här kommer jag att ta bort anställda bord.
Använd följande fråga som används för att ta bort tabellen:
DROP TABLE [AdventureWorks2017].[dbo].[employees]
Jag har installerat Devart dbForge SQL Complete-verktygen i SQL Server Management Studio. När jag kör en SQL DROP TABLE-sats visas en dialogruta för bekräftelse, som visas nedan:
Klicka på Kör ändå . Tabellen släpps.
För att verifiera, kör följande fråga:
SELECT * FROM dbo. employee
Om den tappade tabellen framgångsrikt kommer du att få följande felmeddelande:
Msg 208, Level 16, State 1, Line 1
Invalid object name 'dbo.employee'.
Släpp tabellen som används i en vy
Här kommer vi att försöka ta bort en tabell som används i en databasvy. Kör följande skript för att skapa en vy som heter vPerson :
CREATE VIEW vPerson
AS
SELECT * FROM Person p
Kör DROP TABLE kommandot för att ta bort Personen tabell:
DROP TABLE [AdventureWorks2017].[dbo].[person]
När tabellen har släppts kör du SELECT-frågan för att fylla i data från vPerson . Det kommer att ge ett fel:
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.
Det här felet uppstår när objektet som vyn är beroende av släpps.
Släpp tabellen med en främmande nyckel
Om du har skapat en främmande nyckel på en tabell kan du inte släppa den överordnade tabellen innan du släpper den underordnade tabellen. Det betyder att du måste släppa den underordnade tabellen eller den främmande nyckeln som refererar till den underordnade tabellen först.
Det finns två tabeller som heter tblstudent och tblSchool – ER-diagrammet är följande:
Obs :Jag använder dbForge Studio för SQL Server 2019 att skapa ett databasdiagram – det ger lämplig inblick i tabellstrukturen med alla dess element och entitetsrelationer mellan tabeller.
Följande fråga skapar tabellerna med namnet tblstudent och tblSchool och deras primärnycklar och främmande nycklar:
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
Kör följande fråga för att släppa tblstudent tabell:
Drop table [tblSchool]
Frågan returnerar följande fel:
Msg 3726, Level 16, State 1, Line 22
Could not drop object 'tblSchool' because it is referenced by a FOREIGN KEY constraint.
I vår demo, om du vill släppa tblskolan tabellen måste du släppa tblstudent bordet först. Ta en titt på frågan för att släppa tblStudent och tblschool tabell:
Drop table [tblSchool]
Go
Drop table [tblStudent]
Go
Det är också möjligt att släppa batchtabellen i en enda DROP TABLE-sats. Kör frågan enligt följande:
Drop table [tblSchool], [tblStudent]
Släpp en tabell med index
Låt oss observera ett annat scenario av DROP TABLE-satsbeteendet. Antag att vi har skapat en tabell som heter tblstudent. Den har ett klustrat och ett icke-klustrat index.
När vi släpper en tabell med DROP TABLE, tar den bort indexen? Låt oss kontrollera det. Jag har skapat en tabell som heter tblStudent som har ett klustrat och ett icke-klustrat index. Frågan är följande:
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
Vi kan se listan över index genom att fråga sys.indexes DMV.
När tabellen har släppts kör du följande fråga:
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')
Utdata:
Som du kan se har vi skapat både klustrade och icke-klustrade index för tblStudent bord.
Kör nu följande kommando för att ta bort tabellen:
Drop table tblStudent
Återigen, kör samma fråga som vi använde för att fylla i listan med index:
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')
Utdata:
Ovanstående skärmdump visar att frågan returnerade en tom resultatuppsättning. Således, när vi släpper en tabell, tappar den indexen som är associerade med den tabellen också.
Släpp en tabell från replikering
Anta att du vill ta bort tabellen som är en del av replikeringen. I det här fallet måste du utföra ytterligare steg.
Jag har konfigurerat replikering mellan de två instanserna av SQL Server 2019 som heter SQL01 och SQL02. Därefter har jag replikerat tblStudent och tblSchool tabeller.
Vi släpper tabellen tblSchool från SQL01 genom att köra följande fråga:
use codingsight
go
drop table tblSchool
Utdata:
Msg 3724, Level 16, State 3, Line 3
Cannot drop the table 'tblSchool' because it is being used for replication.
Ovanstående fel är förklarande. För att ta bort tabellen måste vi först ta bort den från replikering:
- Öppna SQL Server Management Studio och anslut till SQL01.
- Utöka replikering -> Expandera Lokal publikation .
- Högerklicka på Publikation och välj Egenskaper .
I Publikationsegenskaper klickar du på Artiklar .
Där kan du se listan med tabeller. Avmarkera tblSchool tabell och klicka på OK .
Obs! När du tar bort artikeln från replikering blir de tidigare ögonblicksbilderna ogiltiga. Du måste skapa en ny ögonblicksbild efter att ha släppt artikeln.
När tabellen har tagits bort från replikeringen, kör du DROP TABLE kommando på SQL01 :
use codingsight
go
drop table tblSchool
Utdata:
Som ni ser har bordet släppts.