sql >> Databasteknik >  >> RDS >> Sqlserver

Förstå DROP TABLE-satsen i SQL Server

SQL Server DROP TABLE-satsen tjänar till att ta bort tabellen från databasen. Den här artikeln kommer att förklara några användningsscenarier och illustrera arbetet med DROP TABLE-satsen med exempel.

För demonstration använder vi wideworldimportors demodatabas – du kan ladda ner den härifrån.

Syntaxen för DROP TABLE-satsen är följande:

Drop table [Database_name].[Schema_name].[table_name]
  • Databasnamn : namnet på databasen som du vill ta bort tabellen från i SQL.
  • Schema_Name : namnet på schemat som tabellen finns för. Om du har skapat tabellen i DBO-schemat kan vi hoppa över denna parameter. Om tabellen skapas i ett icke-standardschema måste vi ange namnet på schemanamnet.
  • Tabell_Name : namnet på tabellen i SQL eller MySQL som du vill ta bort.

När vi släpper en tabell utför SQL-servern följande åtgärder:

  1. Troppar tabellen med data.
  2. Tar bort statistiken för tabellen.
  3. Tappar index, begränsningar och primärnyckel som är associerade med den tabellen. Om vi ​​har de främmande nyckelrelationerna måste vi släppa den underordnade tabellen.

Innan vi släpper bordet måste vi ta hand om följande saker.

  1. Se till att de lagrade procedurer, utlösare och vyer som är beroende av den tabellen ändras eller modifieras. Du kan hitta de nödvändiga databasobjekten med hjälp av sp_depends lagrad procedur.
  2. Använd alltid [databasnamn].[schema_namn].[tabellnamn] format för att ta bort rätt tabell.
  3. Kom ihåg att det är omöjligt att återställa den specifika tabellen från SQL Server-säkerhetskopian. Om du vill återställa en specifik tabell måste du köpa verktyg från tredje part. Om du tror att tabellen kan kräva referenser eller anpassad rapportering, se till att du skapar en säkerhetskopia av tabellen genom att skapa en annan kopia.

Demoinställningar

I demon Wideworldimportors databas, det finns tabeller med namnet tblBusinessEntity , tblCountryRegion, tblCity, och tblCustomer .

  • Tabellerna tblBusinessEntity och tblCustomer är i standardschemat, medan tblCountryRegion ochtblCity är i landet schema.
  • tblCity är en tidstabell med systemversion.
  • Den främmande nyckeln är mellan tblBusinessEntity och tblCustomer tabeller. BusinessEntityID kolumn tblCustomer referenser till BusinessEntityID kolumn (Primärnyckel) för tblBusinessEntity tabell.

Jag har infogat data från AdventureWorks2017 databas med hjälp av INSERT INTO SELECT * FROM-satsen.

T-SQL-skripten för att förbereda demoinstallationen är följande:

Use WideworldImportors
go
CREATE SCHEMA [country]
Go

Skapa tabellerna:

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

Skapa det främmande nyckelindexet:

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

Infoga data i tabellerna:

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 skripten har körts kan vi verifiera om objekten har skapats korrekt och om data har infogats i tabeller.

Kontrollera tabellerna:

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

Utdata:

Få radantalet 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

Utdata:

Låt oss nu utforska användningen av DROP TABLE med exempel.

Exempel 1:Enkel tillämpning av DROP TABLE-satsen

Ibland kan ett misstag inträffa när du arbetar med en tabell. Det händer när en användare försöker släppa en tabell som inte finns. Det finns ett enkelt sätt att undvika detta – med kommandot SQL DROP TABLE IF EXISTS.

Syntaxen är följande:

-- use database
USE [MyDatabase];
GO

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

Du behöver inte kontrollera manuellt om tabellen du vill ta bort redan finns eftersom kommandot DROP TABLE IF EXITS i SQL kommer att göra det åt dig.

Du kan använda SQL Server Management Studio (SSMS) om du behöver släppa alla tabeller.

Anta att vi vill ta bort tblCountryRegion tabell från vår databas. För det, kör följande fråga:

use WideWorldImporters
Go
drop table tblCountryRegion

Vi får felet:

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 nämnts tidigare, för att ta bort tabellen som skapats i icke-standardschemat, måste vi skriva DROP TABLE-satsen i [schemanamn].[tabellnamn] format .

Kör följande fråga:

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

Utdata:

Commands completed successfully.

Vi har släppt tabellen framgångsrikt.

Exempel 2:Släpp en tabell som har en främmande nyckel

Låt oss släppa tblBusinessEntity från databasen – kör följande fråga:

use WideWorldImporters
Go
Drop table tblBusinessEntity

Det returnerar felet:

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 släpper en tabell med en främmande nyckel som refererar till primärnyckeln för den överordnade tabellen, måste vi släppa den överordnade tabellen och sedan kan vi släppa den underordnade tabellen.

I vårt fall, att släppa tblBusinessEntity tabell måste vi släppa tblCustomer tabell. Kör följande fråga:

use WideWorldImporters
Go
Drop table tblcustomer

Tabellen har alltså tagits bort.

Efter att ha tappat tblcustomer , kör följande programsats för att ta bort tblBusinessEntity tabell:

use WideWorldImporters
Go
Drop table tblBusinessEntity

Utdata:

Tabellen har tagits bort.

Exempel 3:Släpp en tidstabell

De systemversionerade temporala tabellerna dök upp först i SQL Server 2016. Dessa tabeller kan hämta raderade och uppdaterade data, eftersom historiktabellen spårar ändringar som inträffade i den temporala tabellen. Se Komma igång med systemversionerade temporala tabeller för mer information om begreppet tidstabeller.

Att släppa temporala tabeller skiljer sig från processen att släppa ett vanligt bord. Vi måste utföra följande steg:

  1. Stäng av SYSTEM_VERSIONING.
  2. Släpp den temporala tabellen.
  3. Släpp historiktabellen.

Låt oss undersöka processen – släpp [Land].[Stad] bord.

Steg 1:Kör följande skript för att stänga av SYSTEM_VERSIONING:

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

Steg 2:Släpp [Land].[Stad] tabell genom att köra följande DROP TABLE-sats:

drop table [Country].[tblCity]

Steg 3:Släpp [Land].[Stadsarkiv] tabell genom att köra följande fråga:

drop table [Country].[City_Archive]

Steg 4:Verifiera att tabellen har tagits bort genom att utföra följande fråga:

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

Utdata:

Som du kan se har tabellen släppts.

Sammanfattning

DROP TABLE-satsen är nödvändig när vi behöver ta bort vissa tabeller från databasen för gott. Men användningen av detta uttalande har sina egenheter. Vi har undersökt flera standardanvändningsfall och möjliga problem som uppstår under uppgifterna.

Vi lärde oss också hur man tillämpar DROP TABLE-satsen för att släppa en enskild tabell, en tabell med en främmande nyckel och den systemversionerade temporala tabellen. Hoppas att den här artikeln är till hjälp.

Läs också

SQL DROP TABLE-sats och olika användningsfall


  1. Vad kan få en Oracle ROWID att ändras?

  2. Kör uppsättning SQL-frågor med batchfil?

  3. Hur grupperar man tidsstämplar i öar (baserat på godtyckligt gap)?

  4. MySQL - FEL 1045 - Åtkomst nekad