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

Forstå DROP TABLE Statement i SQL Server

SQL Server DROP TABLE-sætningen tjener til at fjerne tabellen fra databasen. Denne artikel vil forklare nogle brugsscenarier og illustrere arbejdet med DROP TABLE-sætningen med eksempler.

Til demonstration bruger vi wideworldimportors demodatabase – du kan downloade den herfra.

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

Drop table [Database_name].[Schema_name].[table_name]
  • Databasenavn : navnet på den database, hvorfra du vil slette tabellen i SQL.
  • Schema_Name : navnet på det skema, som tabellen findes for. Hvis du har oprettet tabellen i DBO-skemaet, kan vi springe denne parameter over. Hvis tabellen er oprettet i et ikke-standardskema, skal vi angive navnet på skemanavnet.
  • Tabel_navn : navnet på den tabel i SQL eller MySQL, du vil slette.

Når vi slipper en tabel, udfører SQL Serveren følgende handlinger:

  1. Droper tabellen med data.
  2. Sluter tabellens statistik.
  3. Droper indekser, begrænsninger og primærnøgle forbundet med den tabel. Hvis vi har udenlandske nøglerelationer, skal vi droppe den underordnede tabel.

Inden vi dropper bordet, skal vi tage os af følgende ting.

  1. Sørg for, at de lagrede procedurer, udløsere og visninger, der afhænger af den pågældende tabel, bliver ændret eller modificeret. Du kan finde de nødvendige databaseobjekter ved hjælp af sp_depends gemt procedure.
  2. Brug altid [databasenavn].[skemanavn].[tabelnavn] format for at slippe den korrekte tabel.
  3. Husk, at det er umuligt at gendanne den specifikke tabel fra SQL Server-sikkerhedskopien. Hvis du vil gendanne en bestemt tabel, skal du købe tredjepartsværktøjer. Hvis du mener, at tabellen muligvis kræver referencer eller tilpasset rapportering, skal du sørge for at oprette en sikkerhedskopi af tabellen ved at oprette en anden kopi.

Demoopsætning

I demoen Wideworldimportors database, er der tabeller med navnet tblBusinessEntity , tblCountryRegion, tblCity, og tblCustomer .

  • Tabellerne tblBusinessEntity og tblCustomer er i standardskemaet, mens tblCountryRegion ogtblCity er i landet skema.
  • tblCity er en systemversioneret temporal tabel.
  • Den udenlandske nøgle-begrænsning er mellem tblBusinessEntity og tblCustomer tabeller. BusinessEntityID kolonne af tblCustomer referencer til BusinessEntityID kolonne (primær nøgle) i tblBusinessEntity tabel.

Jeg har indsat data fra AdventureWorks2017 database ved hjælp af INSERT INTO SELECT * FROM-sætningen.

T-SQL-scripts til at forberede demo-opsætningen er som følger:

Use WideworldImportors
go
CREATE SCHEMA [country]
Go

Opret tabellerne:

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

Opret fremmednøgleindekset:

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

Indsæt dataene i tabellerne:

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

Når scripts er udført, kan vi verificere, om objekterne er blevet oprettet korrekt, og om data er blevet indsat i tabeller.

Tjek tabellerne:

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

Output:

Få rækkeantallet i tabeller:

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

Output:

Lad os nu udforske brugen af ​​DROP TABLE ved hjælp af eksempler.

Eksempel 1:Simpel anvendelse af DROP TABLE-sætningen

Nogle gange kan der opstå en fejl, mens du arbejder med en tabel. Det sker, når en bruger forsøger at SLIPPE en tabel, der ikke eksisterer. Der er en enkel måde at undgå dette på – ved at bruge kommandoen SQL DROP TABLE IF EXISTS.

Syntaksen er som følger:

-- use database
USE [MyDatabase];
GO

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

Det er ikke nødvendigt at kontrollere manuelt, om den tabel, du vil slette, allerede eksisterer, fordi kommandoen DROP TABLE IF EXITS i SQL vil gøre det for dig.

Du kan bruge SQL Server Management Studio (SSMS), hvis du skal DROP alle tabeller.

Antag, at vi vil droppe tblCountryRegion tabel fra vores database. For det skal du køre følgende forespørgsel:

use WideWorldImporters
Go
drop table tblCountryRegion

Vi modtager fejlen:

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

Som tidligere nævnt, for at slette tabellen, der er oprettet i ikke-standardskemaet, skal vi skrive DROP TABLE-sætningen i [skemanavn].[tabelnavn] format .

Kør følgende forespørgsel:

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

Output:

Commands completed successfully.

Vi har droppet bordet med succes.

Eksempel 2:Slip en tabel, der har en fremmednøgle

Lad os droppe tblBusinessEntity fra databasen – kør følgende forespørgsel:

use WideWorldImporters
Go
Drop table tblBusinessEntity

Det returnerer fejlen:

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

Når vi slipper en tabel med en fremmednøgle, der refererer til den primære nøgle i den overordnede tabel, skal vi droppe den overordnede tabel, og så kan vi slippe den underordnede tabel.

I vores tilfælde, for at droppe tblBusinessEntity tabellen, skal vi droppe tblCustomer bord. Kør følgende forespørgsel:

use WideWorldImporters
Go
Drop table tblcustomer

Tabellen er således blevet slettet.

Efter at have droppet tblcustomer , kør følgende sætning for at slette tblBusinessEntity tabel:

use WideWorldImporters
Go
Drop table tblBusinessEntity

Output:

Tabellen er blevet slettet.

Eksempel 3:Slip en Temporal tabel

De systemversionerede temporale tabeller dukkede først op i SQL Server 2016. Disse tabeller kan hente slettede og opdaterede data, da historietabellen sporer ændringer, der er sket i den tidsmæssige tabel. Se Kom godt i gang med systemversionerede temporale tabeller for at få flere oplysninger om konceptet med tidsmæssige tabeller.

At droppe tidsmæssige tabeller er forskellig fra processen med at droppe et normalt bord. Vi skal udføre følgende trin:

  1. Sluk for SYSTEM_VERSIONING.
  2. Slip den tidsmæssige tabel.
  3. Slip historiktabellen.

Lad os undersøge processen – slip [Land].[By] tabel.

Trin 1:Kør følgende script for at deaktivere SYSTEM_VERSIONING:

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

Trin 2:Slip [Land].[By] tabel ved at køre følgende DROP TABLE-sætning:

drop table [Country].[tblCity]

Trin 3:Slip [Land].[City_Archive] tabel ved at køre følgende forespørgsel:

drop table [Country].[City_Archive]

Trin 4:Bekræft, at tabellen er blevet slettet ved at udføre følgende forespørgsel:

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

Output:

Som du kan se, er bordet blevet droppet.

Oversigt

DROP TABLE-sætningen er nødvendig, når vi skal fjerne visse tabeller fra databasen for altid. Brugen af ​​denne erklæring har dog sine særheder. Vi har undersøgt flere standard use cases og mulige problemer, der finder sted under opgaverne.

Vi lærte også, hvordan man anvender DROP TABLE-sætningen til at slippe en enkelt tabel, en tabel med en fremmednøgle og den systemversionerede tidsmæssige tabel. Håber, at denne artikel er nyttig.

Læs også

SQL DROP TABLE-erklæring og forskellige brugssager


  1. Sådan opretter og sletter du databaser og tabeller i MySQL

  2. Hvordan skifter man databaser i psql?

  3. Forældede funktioner til at tage ud af din værktøjskasse – Del 3

  4. MySQL Preferred Engine – MyISAM eller InnoDB