Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Informazioni sull'istruzione DROP TABLE in SQL Server

L'istruzione DROP TABLE di SQL Server consente di eliminare la tabella dal database. Questo articolo spiegherà alcuni scenari di utilizzo e illustrerà il lavoro dell'istruzione DROP TABLE mediante esempi.

A scopo dimostrativo, utilizziamo gli importatori wideworld database demo:puoi scaricarlo da qui.

La sintassi dell'istruzione DROP TABLE è la seguente:

Drop table [Database_name].[Schema_name].[table_name]
  • Nome_database : il nome del database da cui vuoi eliminare la tabella in SQL.
  • Nome_schema : il nome dello schema per il quale esiste la tabella. Se hai creato la tabella nello schema DBO, possiamo saltare questo parametro. Se la tabella viene creata in uno schema non predefinito, è necessario specificare il nome del nome dello schema.
  • Nome_tabella : il nome della tabella in SQL o MySQL che vuoi eliminare.

Quando si elimina una tabella, SQL Server esegue le seguenti azioni:

  1. Elimina la tabella con i dati.
  2. Annulla le statistiche della tabella.
  3. Rilascia indici, vincoli e chiave primaria associati a quella tabella. Se abbiamo le relazioni di chiave esterna, dobbiamo eliminare la tabella figlio.

Prima di abbandonare il tavolo, dobbiamo occuparci delle seguenti cose.

  1. Assicurati che le stored procedure, i trigger e le viste che dipendono da quella tabella vengano alterati o modificati. È possibile trovare gli oggetti database necessari utilizzando sp_depends procedura memorizzata.
  2. Utilizza sempre [nome_database].[nome_schema].[nome_tabella] format per eliminare la tabella corretta.
  3. Ricordare che è impossibile ripristinare la tabella specifica dal backup di SQL Server. Se vuoi recuperare una tabella specifica, devi acquistare strumenti di terze parti. Se ritieni che la tabella possa richiedere riferimenti o rapporti personalizzati, assicurati di generare un backup della tabella creando un'altra copia.

Impostazione demo

Nella demo importors Wideworld database, sono presenti tabelle denominate tblBusinessEntity , tblCountryRegion, tblCity, e tblCustomer .

  • Le tabelle tblBusinessEntity e tblCustomer sono nello schema predefinito, mentre tblCountryRegion e tblCity sono nel Paese schema.
  • La tblCity è una tabella temporale con versione di sistema.
  • Il vincolo della chiave esterna è compreso tra tblBusinessEntity e tblCustomer tavoli. BusinessEntityID colonna di tblCustomer riferimenti a BusinessEntityID colonna (Chiave primaria) di tblBusinessEntity tabella.

Ho inserito i dati da AdventureWorks2017 database con l'aiuto dell'istruzione INSERT INTO SELECT * FROM.

Gli script T-SQL per preparare la configurazione demo sono i seguenti:

Use WideworldImportors
go
CREATE SCHEMA [country]
Go

Crea le tabelle:

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

Crea l'indice della chiave esterna:

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

Inserisci i dati nelle tabelle:

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

Una volta eseguiti gli script, possiamo verificare se gli oggetti sono stati creati correttamente e se i dati sono stati inseriti nelle tabelle.

Controlla le tabelle:

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

Uscita:

Ottieni il conteggio delle righe nelle tabelle:

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

Uscita:

Ora, esploriamo l'uso della DROP TABLE tramite esempi.

Esempio 1:semplice applicazione dell'istruzione DROP TABLE

A volte durante l'utilizzo di una tabella potrebbe verificarsi un errore. Succede quando un utente tenta di DROP una tabella che non esiste. C'è un modo semplice per evitarlo:usando il comando SQL DROP TABLE IF EXISTS.

La sintassi è la seguente:

-- use database
USE [MyDatabase];
GO

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

Non è necessario controllare manualmente se la tabella che vuoi eliminare esiste già perché il comando DROP TABLE IF EXITS in SQL lo farà per te.

È possibile utilizzare SQL Server Management Studio (SSMS) se è necessario eliminare tutte le tabelle.

Supponiamo di voler eliminare la tblCountryRegion tabella dal nostro database. Per questo, esegui la seguente query:

use WideWorldImporters
Go
drop table tblCountryRegion

Riceviamo l'errore:

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

Come accennato in precedenza, per eliminare la tabella creata nello schema non predefinito, dobbiamo scrivere l'istruzione DROP TABLE in [schema_name].[table_name] formato .

Esegui la seguente query:

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

Uscita:

Commands completed successfully.

Abbiamo eliminato la tabella con successo.

Esempio 2:elimina una tabella che ha una chiave esterna

Lasciamo perdere tblBusinessEntity dal database:esegui la seguente query:

use WideWorldImporters
Go
Drop table tblBusinessEntity

Restituisce l'errore:

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

Quando eliminiamo una tabella con una chiave esterna che fa riferimento alla chiave primaria della tabella principale, dobbiamo eliminare la tabella principale, quindi possiamo eliminare la tabella secondaria.

Nel nostro caso, eliminare il tblBusinessEntity tabella, dobbiamo eliminare il tblCustomer tavolo. Esegui la seguente query:

use WideWorldImporters
Go
Drop table tblcustomer

Pertanto, la tabella è stata eliminata correttamente.

Dopo aver abbandonato tblcustomer , esegui la seguente istruzione per eliminare tblBusinessEntity tabella:

use WideWorldImporters
Go
Drop table tblBusinessEntity

Uscita:

La tabella è stata eliminata correttamente.

Esempio 3:elimina una tabella temporale

Le tabelle temporali con versione di sistema sono apparse per la prima volta in SQL Server 2016. Queste tabelle possono recuperare i dati eliminati e aggiornati, poiché la tabella della cronologia tiene traccia delle modifiche che si sono verificate nella tabella temporale. Fare riferimento a Guida introduttiva alle tabelle temporali con versione di sistema per ulteriori informazioni sul concetto di tabelle temporali.

L'eliminazione delle tabelle temporali è diversa dal processo di eliminazione di una tabella normale. Dobbiamo eseguire i seguenti passaggi:

  1. Disattiva SYSTEM_VERSIONING.
  2. Elimina la tabella temporale.
  3. Elimina la tabella della cronologia.

Esaminiamo il processo:rilascia il [Paese].[Città] tabella.

Passaggio 1:esegui il seguente script per disattivare SYSTEM_VERSIONING:

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

Passaggio 2:rilascia il [Paese].[Città] tabella eseguendo la seguente istruzione DROP TABLE:

drop table [Country].[tblCity]

Passaggio 3:rilascia il [Paese].[City_Archive] tabella eseguendo la query seguente:

drop table [Country].[City_Archive]

Passaggio 4:verifica che la tabella sia stata eliminata eseguendo la query seguente:

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

Uscita:

Come puoi vedere, la tabella è stata eliminata.

Riepilogo

L'istruzione DROP TABLE è necessaria quando è necessario rimuovere definitivamente determinate tabelle dal database. Tuttavia, l'uso di questa affermazione ha le sue peculiarità. Abbiamo esplorato diversi casi d'uso standard e possibili problemi che si verificano durante le attività.

Abbiamo anche imparato come applicare l'istruzione DROP TABLE per eliminare una singola tabella, una tabella con una chiave esterna e la tabella temporale con versione del sistema. Spero che questo articolo sia utile.

Leggi anche

Istruzione SQL DROP TABLE e vari casi d'uso