Database
 sql >> Datenbank >  >> RDS >> Database

SQL DROP TABLE-Anweisung und verschiedene Anwendungsfälle

Die SQL-Anweisung DROP TABLE dient dazu, die Tabelle aus der Datenbank zu löschen. Es entfernt die Tabelle und die ihr zugeordneten Daten und Indizes. Die Aussage ist irreversibel. Daher können Sie die Tabelle nur wiederherstellen, indem Sie die Sicherung wiederherstellen.

Dieser Artikel behandelt die folgenden Fälle:

  1. Löschen Sie eine oder mehrere Tabellen.
  2. Löschen Sie die in einer Ansicht verwendete Tabelle.
  3. Lösche die Tabelle mit einem Fremdschlüssel.
  4. Löschen Sie die Tabelle mit geclusterten und nicht geclusterten Indizes.
  5. Löschen Sie die Tabelle aus der Replikationskonfiguration.

Die Syntax der DROP TABLE-Anweisung lautet wie folgt:

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

Hinweis:Wenn Sie SQL Server 2016 und höher verwenden, können Sie IF EXISTS angeben vor der DROP TABLE Aussage.

Außerdem geben Sie den Tabellennamen nach der DROP TABLE-Anweisung an. Das Format des Tabellennamens sollte [Datenbankname].[Schemaname].[Tabellenname].

sein

Ein einfaches Beispiel für die DROP TABLE-Anweisung

Für die Demonstration habe ich AdventureWorks2017 wiederhergestellt Datenbank auf meiner Workstation. Hier werde ich die Mitarbeiter löschen Tabelle.

Verwenden Sie die folgende Abfrage zum Löschen der Tabelle:

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

Ich habe die Devart dbForge SQL Complete-Tools in SQL Server Management Studio installiert. Wenn ich eine SQL DROP TABLE-Anweisung ausführe, erscheint ein Bestätigungsdialogfeld, wie unten gezeigt:

Klicken Sie auf Trotzdem ausführen . Die Tabelle wird gelöscht.

Führen Sie zur Überprüfung die folgende Abfrage aus:

SELECT * FROM dbo. employee

Wenn die Tabelle erfolgreich gelöscht wurde, erhalten Sie die folgende Fehlermeldung:

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

Löschen Sie die verwendete Tabelle in einer Ansicht

Hier werden wir versuchen, eine Tabelle zu löschen, die in einer Datenbankansicht verwendet wird. Führen Sie das folgende Skript aus, um eine Ansicht namens vPerson zu erstellen :

CREATE VIEW vPerson 
AS
SELECT * FROM Person p

Führen Sie die DROP TABLE aus Befehl zum Entfernen der Person Tabelle:

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

Führen Sie nach dem Löschen der Tabelle die SELECT-Abfrage aus, um die Daten von vPerson aufzufüllen . Es wird einen Fehler erzeugen:

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.

Dieser Fehler tritt auf, wenn das Objekt, von dem die Ansicht abhängig ist, gelöscht wird.

Lösche die Tabelle mit einem Fremdschlüssel

Wenn Sie einen Fremdschlüssel für eine Tabelle erstellt haben, können Sie die übergeordnete Tabelle nicht löschen, bevor Sie die untergeordnete Tabelle löschen. Das bedeutet, dass Sie zuerst die untergeordnete Tabelle oder den Fremdschlüssel löschen müssen, der auf die untergeordnete Tabelle verweist.

Es gibt zwei Tabellen namens tblstudent und tblSchool – das ER-Diagramm ist das folgende:

Hinweis :Ich verwende dbForge Studio für SQL Server 2019 zum Erstellen eines Datenbankdiagramms – es gibt einen angemessenen Einblick in die Tabellenstruktur mit all ihren Elementen und Entitätsbeziehungen zwischen Tabellen.

Die folgende Abfrage erstellt die Tabellen mit dem Namen tblstudent und tblSchool und ihre Primärschlüssel und Fremdschlüssel:

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

Führen Sie die folgende Abfrage aus, um tblstudent zu löschen Tabelle:

Drop table [tblSchool]

Die Abfrage gibt den folgenden Fehler zurück:

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

Wenn Sie in unserer Demo die tblschool löschen möchten Tabelle müssen Sie tblstudent löschen Tisch zuerst. Sehen Sie sich die Abfrage zum Löschen des tblStudent an und tblschool Tabelle:

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

Es ist auch möglich, die Stapeltabelle in einer einzigen DROP TABLE-Anweisung zu löschen. Führen Sie die Abfrage wie folgt aus:

Drop table [tblSchool], [tblStudent]

Löschen Sie eine Tabelle mit Indizes

Betrachten wir ein weiteres Szenario des Verhaltens der DROP TABLE-Anweisung. Angenommen, wir haben eine Tabelle mit dem Namen tblstudent. erstellt Es hat einen geclusterten und einen nicht geclusterten Index.

Wenn wir eine Tabelle mit DROP TABLE löschen, werden dann die Indizes entfernt? Lassen Sie es uns überprüfen. Ich habe eine Tabelle namens tblStudent erstellt die einen gruppierten und einen nicht gruppierten Index hat. Die Abfrage lautet wie folgt:

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

Wir können die Liste der Indizes sehen, indem wir sys.indexes abfragen DMV.

Führen Sie nach dem Löschen der Tabelle die folgende Abfrage aus:

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

Ausgabe:

Wie Sie sehen können, haben wir sowohl die geclusterten als auch die nicht geclusterten Indizes für tblStudent erstellt Tabelle.

Führen Sie nun den folgenden Befehl aus, um die Tabelle zu löschen:

Drop table tblStudent

Führen Sie erneut dieselbe Abfrage aus, die wir zum Füllen der Indexliste verwendet haben:

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

Ausgabe:

Der obige Screenshot zeigt, dass die Abfrage eine leere Ergebnismenge zurückgegeben hat. Wenn wir also eine Tabelle löschen, werden auch die mit dieser Tabelle verknüpften Indizes gelöscht.

Löschen Sie eine Tabelle aus der Replikation

Angenommen, Sie möchten die Tabelle löschen, die Teil der Replikation ist. In diesem Fall müssen Sie zusätzliche Schritte ausführen.

Ich habe die Replikation zwischen den beiden Instanzen von SQL Server 2019 mit den Namen SQL01 und SQL02 konfiguriert. Als Nächstes habe ich tblStudent repliziert und tblSchool Tabellen.

Wir löschen die tblSchool-Tabelle aus SQL01, indem wir die folgende Abfrage ausführen:

use codingsight
go
drop table tblSchool

Ausgabe:

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

Der obige Fehler ist erklärend. Um die Tabelle zu löschen, müssen wir sie zuerst aus der Replikation entfernen:

  1. Öffnen Sie SQL Server Management Studio und verbinden Sie sich mit SQL01.
  2. Erweitern Sie Replikation -> Erweitern Sie Lokale Veröffentlichung .
  3. Klicken Sie mit der rechten Maustaste auf Veröffentlichung und wählen Sie Eigenschaften .

In den Publikationseigenschaften Fenster, klicken Sie auf Artikel .

Dort können Sie die Liste der Tabellen sehen. Deaktivieren Sie tblSchool Tabelle und klicken Sie auf OK .

Hinweis: Wenn Sie den Artikel aus der Replikation löschen, werden die vorherigen Snapshots ungültig. Sie müssen nach dem Löschen des Artikels einen neuen Snapshot erstellen.

Sobald die Tabelle aus der Replikation entfernt wurde, führen Sie DROP TABLE aus Befehl auf SQL01 :

use codingsight
go
drop table tblSchool

Ausgabe:

Wie Sie sehen können, wurde die Tabelle gelöscht.