Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Grundlegendes zur DROP TABLE-Anweisung in SQL Server

Die SQL Server DROP TABLE-Anweisung dient dazu, die Tabelle aus der Datenbank zu löschen. Dieser Artikel wird einige Anwendungsszenarien erklären und die Arbeit der DROP TABLE-Anweisung anhand von Beispielen veranschaulichen.

Zur Demonstration verwenden wir die wideworldimportors Demo-Datenbank – Sie können sie hier herunterladen.

Die Syntax der DROP TABLE-Anweisung lautet wie folgt:

Drop table [Database_name].[Schema_name].[table_name]
  • Datenbankname : den Namen der Datenbank, aus der Sie die Tabelle in SQL löschen möchten.
  • Schema_Name : der Name des Schemas, für das die Tabelle existiert. Wenn Sie die Tabelle im DBO-Schema erstellt haben, können wir diesen Parameter überspringen. Wenn die Tabelle in einem nicht standardmäßigen Schema erstellt wird, müssen wir den Namen des Schemanamens angeben.
  • Tabellenname : den Namen der Tabelle in SQL oder MySQL, die Sie löschen möchten.

Wenn wir eine Tabelle löschen, führt der SQL Server die folgenden Aktionen aus:

  1. Löscht die Tabelle mit Daten.
  2. Löscht die Statistik der Tabelle.
  3. Löscht Indizes, Einschränkungen und Primärschlüssel, die dieser Tabelle zugeordnet sind. Wenn wir die Fremdschlüsselbeziehungen haben, müssen wir die untergeordnete Tabelle löschen.

Bevor wir den Tisch fallen lassen, müssen wir uns um die folgenden Dinge kümmern.

  1. Stellen Sie sicher, dass die gespeicherten Prozeduren, Trigger und Ansichten, die von dieser Tabelle abhängen, geändert oder modifiziert werden. Sie können die erforderlichen Datenbankobjekte mithilfe von sp_depends finden gespeicherte Prozedur.
  2. Verwenden Sie immer [Datenbankname].[Schemaname].[Tabellenname] Format, um die richtige Tabelle zu löschen.
  3. Denken Sie daran, dass es unmöglich ist, die spezifische Tabelle aus der SQL Server-Sicherung wiederherzustellen. Wenn Sie eine bestimmte Tabelle wiederherstellen möchten, müssen Sie Tools von Drittanbietern kaufen. Wenn Sie der Meinung sind, dass für die Tabelle möglicherweise Referenzen oder benutzerdefinierte Berichte erforderlich sind, stellen Sie sicher, dass Sie eine Sicherungskopie der Tabelle erstellen, indem Sie eine weitere Kopie erstellen.

Demo-Setup

In der Demo Wideworldimportors Datenbank gibt es Tabellen namens tblBusinessEntity , tblCountryRegion, tblCity, und tblCustomer .

  • Die Tabellen tblBusinessEntity und tblCustomer befinden sich im Standardschema, während tblCountryRegion undtblCity in dem Land sind Schema.
  • Die tblCity ist eine vom System versionierte temporale Tabelle.
  • Die Fremdschlüsseleinschränkung liegt zwischen tblBusinessEntity und tblCustomer Tische. Die BusinessEntityID Spalte von tblCustomer Verweise auf BusinessEntityID Spalte (Primärschlüssel) der tblBusinessEntity Tabelle.

Ich habe Daten aus AdventureWorks2017 eingefügt Datenbank mit Hilfe der Anweisung INSERT INTO SELECT * FROM.

Die T-SQL-Skripte zum Vorbereiten des Demo-Setups lauten wie folgt:

Use WideworldImportors
go
CREATE SCHEMA [country]
Go

Erstellen Sie die Tabellen:

Use WideworldImportors
go
CREATE TABLE [tblBusinessEntity](
	[BusinessEntityID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
	[ModifiedDate] [datetime] NOT NULL,
 CONSTRAINT [PK_BusinessEntity_BusinessEntityID] PRIMARY KEY CLUSTERED 
([BusinessEntityID] ASC))
GO

CREATE TABLE [Country].[tblCountryRegion](
	[CountryRegionCode] [nvarchar](3) NOT NULL,
	[Name] varchar(500) NOT NULL
 CONSTRAINT [Country].[PK_CountryRegion_CountryRegionCode] PRIMARY KEY CLUSTERED 
([CountryRegionCode] ASC))
GO
CREATE TABLE [tblCustomer](
	[BusinessEntityID] [int] NOT NULL,
	[PersonType] [nchar](2) NOT NULL,
	[NameStyle] varchar(15) NOT NULL,
	[Title] [nvarchar](8) NULL,
	[FirstName] varchar(150) NOT NULL,
	[MiddleName] varchar(150) NULL,
	[LastName] varchar(150) NOT NULL,
	[Suffix] [nvarchar](10) NULL,
	[EmailPromotion] [int] NOT NULL,
	[ModifiedDate] [datetime] NOT NULL,
 CONSTRAINT [PK_Person_BusinessEntityID] PRIMARY KEY CLUSTERED 
([BusinessEntityID] ASC))
GO
CREATE TABLE [Country].[tblCity](
	[CityID] [int] NOT NULL,
	[CityName] [nvarchar](50) NOT NULL,
	[StateProvinceID] [int] NOT NULL,
	[LatestRecordedPopulation] [bigint] NULL,
	[LastEditedBy] [int] NOT NULL,
	[ValidFrom] [datetime2](7) GENERATED ALWAYS AS ROW START NOT NULL,
	[ValidTo] [datetime2](7) GENERATED ALWAYS AS ROW END NOT NULL,
 CONSTRAINT [PK_Country_Cities] PRIMARY KEY CLUSTERED 
(
	[CityID] ASC
),
	PERIOD FOR SYSTEM_TIME ([ValidFrom], [ValidTo])
) ON [USERDATA] TEXTIMAGE_ON [USERDATA]
WITH
(
SYSTEM_VERSIONING = ON ( HISTORY_TABLE = [Country].[City_Archive] )
)
GO

Erstellen Sie den Fremdschlüsselindex:

Use WideworldImportors
go
ALTER TABLE [tblCustomer]  WITH CHECK ADD  CONSTRAINT [FK_Person_BusinessEntity_BusinessEntityID] FOREIGN KEY([BusinessEntityID])
REFERENCES [tblBusinessEntity] ([BusinessEntityID])
GO

Fügen Sie die Daten in die Tabellen ein:

Use WideworldImportors
Go
set identity_insert tblBusinessEntity on
Go
insert into tblBusinessEntity ([BusinessEntityID],[ModifiedDate])
select [BusinessEntityID],[ModifiedDate] from [AdventureWorks2017].[Person].[BusinessEntity]
Go
set identity_insert tblBusinessEntity off
Go
insert into tblCustomer ([BusinessEntityID],[PersonType],[NameStyle],[Title],[FirstName],[MiddleName],[LastName],[Suffix],[EmailPromotion],[ModifiedDate])
select [BusinessEntityID],[PersonType],[NameStyle],[Title],[FirstName],[MiddleName],[LastName],[Suffix],[EmailPromotion],[ModifiedDate] 
from AdventureWorks2017.Person.Person
Go
insert into [Country].[tblCountryRegion]([CountryRegionCode],[Name]) 
select  [CountryRegionCode],[Name] from [AdventureWorks2017].[Person].[CountryRegion]
Go

Sobald die Skripte ausgeführt wurden, können wir überprüfen, ob die Objekte korrekt erstellt wurden und ob Daten in Tabellen eingefügt wurden.

Prüfen Sie die Tabellen:

Use WideWorldImporters
Go
select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME in ('tblCustomer','tblCountryRegion','tblBusinessEntity')
Go

Ausgabe:

Abrufen der Zeilenanzahl in Tabellen:

Use WideWorldImporters
Go
select object_name(object_id) as [Table Name], rows [Total Rows] from sys.partitions 
where object_id in (object_id('tblCustomer'),object_id('country.tblCountryRegion'),object_id('tblBusinessEntity'))
Go

Ausgabe:

Lassen Sie uns nun anhand von Beispielen die Verwendung der DROP TABLE untersuchen.

Beispiel 1:Einfache Anwendung der DROP TABLE-Anweisung

Manchmal kann beim Arbeiten mit einer Tabelle ein Fehler auftreten. Es passiert, wenn ein Benutzer versucht, eine Tabelle zu löschen, die nicht existiert. Es gibt eine einfache Möglichkeit, dies zu vermeiden – mit dem SQL-Befehl DROP TABLE IF EXISTS.

Die Syntax lautet wie folgt:

-- use database
USE [MyDatabase];
GO

-- attempt to run DROP TABLE only if it exists 
DROP TABLE IF EXISTS [dbo].[MyTable0];
GO

Es ist nicht nötig, manuell zu prüfen, ob die Tabelle, die Sie löschen möchten, bereits existiert, da der Befehl DROP TABLE IF EXITS in SQL dies für Sie erledigt.

Sie können SQL Server Management Studio (SSMS) verwenden, wenn Sie alle Tabellen löschen müssen.

Angenommen, wir möchten tblCountryRegion löschen Tabelle aus unserer Datenbank. Führen Sie dazu die folgende Abfrage aus:

use WideWorldImporters
Go
drop table tblCountryRegion

Wir erhalten den Fehler:

Msg 3701, Level 11, State 5, Line 3
Cannot drop the table 'tblCountryRegion' because it does not exist 
or you do not have permission.

Wie bereits erwähnt, müssen wir zum Löschen der im nicht standardmäßigen Schema erstellten Tabelle die DROP TABLE-Anweisung in [schema_name].[table_name] schreiben formatieren .

Führen Sie die folgende Abfrage aus:

use WideWorldImporters
Go
drop table [country].[tblCountryRegion]

Ausgabe:

Commands completed successfully.

Wir haben die Tabelle erfolgreich gelöscht.

Beispiel 2:Löschen einer Tabelle mit Fremdschlüssel

Lassen Sie uns die tblBusinessEntity löschen aus der Datenbank – Führen Sie die folgende Abfrage aus:

use WideWorldImporters
Go
Drop table tblBusinessEntity

Es gibt den Fehler zurück:

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

Wenn wir eine Tabelle mit einem Fremdschlüssel löschen, der auf den Primärschlüssel der übergeordneten Tabelle verweist, müssen wir die übergeordnete Tabelle löschen, und dann können wir die untergeordnete Tabelle löschen.

In unserem Fall, um die tblBusinessEntity zu löschen Tabelle müssen wir tblCustomer löschen Tisch. Führen Sie die folgende Abfrage aus:

use WideWorldImporters
Go
Drop table tblcustomer

Somit wurde die Tabelle erfolgreich gelöscht.

Nach dem Löschen von tblcustomer , führen Sie die folgende Anweisung aus, um tblBusinessEntity zu löschen Tabelle:

use WideWorldImporters
Go
Drop table tblBusinessEntity

Ausgabe:

Die Tabelle wurde erfolgreich gelöscht.

Beispiel 3:Löschen einer Temporal-Tabelle

Die vom System versionierten temporalen Tabellen erschienen erstmals in SQL Server 2016. Diese Tabellen können gelöschte und aktualisierte Daten abrufen, da die Verlaufstabelle Änderungen nachverfolgt, die in der temporalen Tabelle aufgetreten sind. Weitere Informationen zum Konzept temporaler Tabellen finden Sie unter Erste Schritte mit systemversionierten temporalen Tabellen.

Das Löschen temporaler Tabellen unterscheidet sich vom Löschen einer gewöhnlichen Tabelle. Wir müssen die folgenden Schritte ausführen:

  1. Schalten Sie SYSTEM_VERSIONING aus.
  2. Löschen Sie die temporale Tabelle.
  3. Löschen Sie die Verlaufstabelle.

Untersuchen wir den Vorgang – lassen Sie [Country].[City] fallen Tabelle.

Schritt 1:Führen Sie das folgende Skript aus, um SYSTEM_VERSIONING zu deaktivieren:

Alter table [Country].[tblCity] set ( SYSTEM_VERSIONING = OFF  )

Schritt 2:Legen Sie [Land].[Stadt] ab Tabelle, indem Sie die folgende DROP TABLE-Anweisung ausführen:

drop table [Country].[tblCity]

Schritt 3:Legen Sie [Country].[City_Archive] ab Tabelle, indem Sie die folgende Abfrage ausführen:

drop table [Country].[City_Archive]

Schritt 4:Überprüfen Sie, ob die Tabelle gelöscht wurde, indem Sie die folgende Abfrage ausführen:

Use WideWorldImporters
Go
select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME in ('tblCity')

Ausgabe:

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

Zusammenfassung

Die DROP TABLE-Anweisung ist notwendig, wenn wir bestimmte Tabellen endgültig aus der Datenbank entfernen müssen. Die Verwendung dieser Anweisung hat jedoch ihre Besonderheiten. Wir haben mehrere Standardanwendungsfälle und mögliche Probleme untersucht, die während der Aufgaben auftreten.

Wir haben auch gelernt, wie man die DROP TABLE-Anweisung anwendet, um eine einzelne Tabelle, eine Tabelle mit einem Fremdschlüssel und die vom System versionierte temporale Tabelle zu löschen. Ich hoffe, dass dieser Artikel hilfreich ist.

Lesen Sie auch

SQL DROP TABLE-Anweisung und verschiedene Anwendungsfälle