sql >> Database teknologi >  >> RDS >> Database

SQL DROP TABLE-erklæring og forskellige brugssager

SQL DROP TABLE-sætningen tjener til at fjerne tabellen fra databasen. Det fjerner tabellen og dens data og indekser knyttet til den. Udsagnet er irreversibelt. Du kan således kun gendanne tabellen ved at gendanne sikkerhedskopien.

Denne artikel dækker følgende tilfælde:

  1. Slet en eller flere tabeller.
  2. Slet tabellen brugt i en visning.
  3. Slet tabellen med en fremmednøgle.
  4. Slet tabellen med klyngede og ikke-klyngede indekser.
  5. Slet tabellen fra replikeringsopsætningen.

Syntaksen for DROP TABLE-sætningen er følgende:

IF EXISTS DROP TABLE [DatabaseName].[SchemaName].[TableName]

Bemærk:Hvis du bruger SQL Server 2016 og nyere, kan du angive HVIS EKSISTERER før SLIPTABELLEN erklæring.

Du angiver også tabelnavnet efter DROP TABLE-sætningen. Tabelnavnsformatet skal være [Databasenavn].[Skemanavn].[Tabelnavn].

Et simpelt eksempel på DROP TABLE-sætningen

Til demonstrationen har jeg gendannet AdventureWorks2017 database på min arbejdsstation. Her vil jeg slette medarbejderne tabel.

Brug følgende forespørgsel til at slette tabellen:

DROP TABLE [AdventureWorks2017].[dbo].[employees]

Jeg har installeret Devart dbForge SQL Complete-værktøjerne i SQL Server Management Studio. Når jeg udfører en SQL DROP TABLE-sætning, beder den en bekræftelsesdialogboks, som vist nedenfor:

Klik på Udfør alligevel . Tabellen er droppet.

For at bekræfte, kør følgende forespørgsel:

SELECT * FROM dbo. employee

Hvis det lykkedes at slette tabellen, vil du modtage følgende fejlmeddelelse:

Msg 208, Level 16, State 1, Line 1
Invalid object name 'dbo.employee'.

Slip tabellen brugt i en visning

Her vil vi forsøge at droppe en tabel brugt i en databasevisning. Udfør følgende script for at oprette en visning med navnet vPerson :

CREATE VIEW vPerson 
AS
SELECT * FROM Person p

Kør DROP TABLE kommandoen for at fjerne Personen tabel:

DROP TABLE [AdventureWorks2017].[dbo].[person]

Når tabellen er slettet, skal du køre SELECT-forespørgslen for at udfylde dataene fra vPerson . Det vil producere en fejl:

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.

Denne fejl opstår, når det objekt, som visningen er afhængig af, slettes.

Slip tabellen med en fremmednøgle

Hvis du har oprettet en fremmednøgle på en tabel, kan du ikke slette den overordnede tabel, før du slipper den underordnede tabel. Det betyder, at du først skal slippe den underordnede tabel eller den fremmednøgle, der refererer til den underordnede tabel.

Der er to tabeller med navnet tblstudent og tblSchool – ER-diagrammet er følgende:

Bemærk :Jeg bruger dbForge Studio til SQL Server 2019 at oprette et databasediagram – det giver passende indsigt i tabelstrukturen med alle dens elementer og entitetsforhold mellem tabeller.

Følgende forespørgsel opretter tabellerne med navnet tblstudent og tblSchool og deres primære nøgler og fremmednøgler:

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ølgende forespørgsel for at slippe tblstudent tabel:

Drop table [tblSchool]

Forespørgslen returnerer følgende fejl:

Msg 3726, Level 16, State 1, Line 22
Could not drop object 'tblSchool' because it is referenced by a FOREIGN KEY constraint.

I vores demo, hvis du vil droppe tblschool tabellen, skal du droppe tblstudent bord først. Tag et kig på forespørgslen for at slippe tblStudent og tblschool tabel:

Drop table [tblSchool]
Go
Drop table [tblStudent]
Go

Det er også muligt at droppe batchtabellen i en enkelt DROP TABLE-sætning. Kør forespørgslen som følger:

Drop table [tblSchool], [tblStudent]

Slip en tabel med indekser

Lad os observere et andet scenarie for DROP TABLE-sætningsadfærden. Antag, at vi har oprettet en tabel med navnet tblstudent. Det har et klynget og et ikke-klynget indeks.

Når vi dropper en tabel ved hjælp af DROP TABLE, fjerner den så indekserne? Lad os tjekke det. Jeg har oprettet en tabel med navnet tblStudent der har et klynget og et ikke-klynget indeks. Forespørgslen er følgende:

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 listen over indekserne ved at forespørge på sys.indexes DMV.

Når tabellen er slettet, skal du køre følgende forespørgsel:

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

Output:

Som du kan se, har vi oprettet både de klyngede og ikke-klyngede indekser til tblStudenten tabel.

Kør nu følgende kommando for at slette tabellen:

Drop table tblStudent

Kør igen den samme forespørgsel, som vi brugte til at udfylde listen over indekser:

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

Output:

Ovenstående skærmbillede illustrerer, at forespørgslen returnerede et tomt resultatsæt. Derfor, når vi dropper en tabel, taber den også indekserne, der er knyttet til den tabel.

Slip en tabel fra replikering

Antag, at du vil droppe den tabel, der er en del af replikering. I dette tilfælde skal du udføre yderligere trin.

Jeg har konfigureret replikering mellem de to forekomster af SQL Server 2019 ved navn SQL01 og SQL02. Dernæst har jeg replikeret tblStudent og tblSchool tabeller.

Vi fjerner tabellen tblSchool fra SQL01 ved at udføre følgende forespørgsel:

use codingsight
go
drop table tblSchool

Output:

Msg 3724, Level 16, State 3, Line 3
Cannot drop the table 'tblSchool' because it is being used for replication.

Ovenstående fejl er forklarende. For at slette tabellen skal vi først fjerne den fra replikering:

  1. Åbn SQL Server Management Studio og opret forbindelse til SQL01.
  2. Udvid replikering -> Udvid Lokal udgivelse .
  3. Højreklik på Udgivelse, og vælg Egenskaber .

I Publikationsegenskaber vindue, skal du klikke på Artikler .

Der kan du se listen over tabeller. Fjern markeringen i tblSchool tabel og klik på OK .

Bemærk: Når du dropper artiklen fra replikering, bliver de tidligere snapshots ugyldige. Du skal generere et nyt øjebliksbillede efter at have droppet artiklen.

Når tabellen er fjernet fra replikeringen, skal du udføre DROP TABLE kommando på SQL01 :

use codingsight
go
drop table tblSchool

Output:

Som du kan se, er bordet faldet.


  1. Parse kommasepareret streng for at lave IN Liste over strenge i Where-sætningen

  2. 7 ting at vide om rum på Oracle Cloud Infrastructure

  3. Deltager til MAX datoregistrering i gruppe

  4. Hvordan får man en særskilt liste over ord brugt i alle feltposter ved hjælp af MS SQL?