sql >> Database >  >> RDS >> Sqlserver

DROP TABLE-instructie in SQL Server begrijpen

De SQL Server DROP TABLE-instructie dient om de tabel uit de database te verwijderen. Dit artikel zal enkele gebruiksscenario's uitleggen en het werk van de DROP TABLE-instructie aan de hand van voorbeelden illustreren.

Voor demonstratie gebruiken we de wideworldimportors demo-database – u kunt deze hier downloaden.

De syntaxis van de DROP TABLE-instructie is als volgt:

Drop table [Database_name].[Schema_name].[table_name]
  • Database_name : de naam van de database waaruit u de tabel in SQL wilt verwijderen.
  • Schema_Name : de naam van het schema waarvoor de tabel bestaat. Als u de tabel in het DBO-schema heeft gemaakt, kunnen we deze parameter overslaan. Als de tabel is gemaakt in een niet-standaard schema, moeten we de naam van de schemanaam specificeren.
  • Table_Name : de naam van de tabel in SQL of MySQL die u wilt verwijderen.

Wanneer we een tabel neerzetten, voert de SQL Server de volgende acties uit:

  1. Laat de tabel met gegevens vallen.
  2. Verwijdert de statistieken van de tabel.
  3. Verwijdert indexen, beperkingen en primaire sleutel die aan die tabel zijn gekoppeld. Als we relaties met refererende sleutels hebben, moeten we de onderliggende tabel laten vallen.

Voordat we de tafel laten vallen, moeten we de volgende dingen regelen.

  1. Zorg ervoor dat de opgeslagen procedures, triggers en weergaven die afhankelijk zijn van die tabel, worden gewijzigd of aangepast. U kunt de benodigde database-objecten vinden met behulp van de sp_depends opgeslagen procedure.
  2. Gebruik altijd [database_name].[schema_name].[table_name] formaat om de juiste tabel te laten vallen.
  3. Houd er rekening mee dat het onmogelijk is om de specifieke tabel te herstellen vanuit de SQL Server-back-up. Als u een specifieke tabel wilt herstellen, moet u tools van derden kopen. Als u denkt dat de tabel referenties of aangepaste rapportage nodig heeft, zorg er dan voor dat u een back-up van de tabel maakt door een nieuwe kopie te maken.

Demo instellen

In de demo Wideworldimportors database, zijn er tabellen met de naam tblBusinessEntity , tblCountryRegion, tblCity, en tblCustomer .

  • De tabellen tblBusinessEntity en tblCustomer zijn in het standaardschema, terwijl tblCountryRegion en tblCity zijn in het Land schema.
  • De tblCity is een tijdelijke tabel met systeemversie.
  • De beperking van de refererende sleutel ligt tussen tblBusinessEntity en tblCustomer tafels. De BusinessEntityID kolom van tblCustomer verwijzingen naar BusinessEntityID kolom (primaire sleutel) van de tblBusinessEntity tafel.

Ik heb gegevens ingevoegd van de AdventureWorks2017 database met behulp van de instructie INSERT INTO SELECT * FROM.

De T-SQL-scripts om de demo-setup voor te bereiden zijn als volgt:

Use WideworldImportors
go
CREATE SCHEMA [country]
Go

Maak de 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

Maak de refererende sleutelindex:

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

Voeg de gegevens in de tabellen in:

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

Zodra de scripts zijn uitgevoerd, kunnen we controleren of de objecten correct zijn gemaakt en of gegevens in tabellen zijn ingevoegd.

Controleer de tabellen:

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

Uitgang:

Krijg het aantal rijen 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

Uitgang:

Laten we nu eens kijken naar het gebruik van de DROP TABLE aan de hand van voorbeelden.

Voorbeeld 1:Eenvoudige toepassing van het DROP TABLE-statement

Soms kan er tijdens het werken met een tabel een fout optreden. Het gebeurt wanneer een gebruiker een tabel probeert te DROPPEN die niet bestaat. Er is een eenvoudige manier om dit te voorkomen – met het commando SQL DROP TABLE IF EXISTS.

De syntaxis is als volgt:

-- use database
USE [MyDatabase];
GO

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

Het is niet nodig om handmatig te controleren of de tabel die u wilt verwijderen al bestaat, omdat het commando DROP TABLE IF EXITS in SQL dit voor u doet.

U kunt SQL Server Management Studio (SSMS) gebruiken als u alle tabellen moet DROPPEN.

Stel dat we de tblCountryRegion . willen laten vallen tabel uit onze database. Voer daarvoor de volgende query uit:

use WideWorldImporters
Go
drop table tblCountryRegion

We krijgen de foutmelding:

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

Zoals eerder vermeld, moeten we de DROP TABLE-instructie schrijven in de [schema_name].[table_name] om de tabel die is gemaakt in het niet-standaardschema te verwijderen, formaat .

Voer de volgende query uit:

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

Uitgang:

Commands completed successfully.

We hebben de tafel met succes laten vallen.

Voorbeeld 2:Verwijder een tabel met een externe sleutel

Laten we de tblBusinessEntity . laten vallen uit de database – voer de volgende query uit:

use WideWorldImporters
Go
Drop table tblBusinessEntity

Het geeft de fout:

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

Als we een tabel verwijderen met een externe sleutel die verwijst naar de primaire sleutel van de bovenliggende tabel, moeten we de bovenliggende tabel verwijderen, en dan kunnen we de onderliggende tabel verwijderen.

In ons geval, om de tblBusinessEntity . te laten vallen tabel, moeten we de tblCustomer . weglaten tafel. Voer de volgende query uit:

use WideWorldImporters
Go
Drop table tblcustomer

De tafel is dus succesvol verwijderd.

Na het laten vallen van tblcustomer , voer de volgende instructie uit om de tblBusinessEntity . te verwijderen tafel:

use WideWorldImporters
Go
Drop table tblBusinessEntity

Uitgang:

De tafel is succesvol verwijderd.

Voorbeeld 3:Een tijdelijke tafel neerzetten

De tijdelijke tabellen met systeemversies verschenen voor het eerst in SQL Server 2016. Deze tabellen kunnen verwijderde en bijgewerkte gegevens ophalen, aangezien de geschiedenistabel wijzigingen bijhoudt die zich in de tijdelijke tabel hebben voorgedaan. Raadpleeg Aan de slag met tijdelijke tabellen met systeemversies voor meer informatie over het concept van tijdelijke tabellen.

Het laten vallen van tijdelijke tabellen is anders dan het verwijderen van een gebruikelijke tabel. We moeten de volgende stappen uitvoeren:

  1. Schakel de SYSTEM_VERSIONING uit.
  2. Laat de tijdelijke tabel vallen.
  3. Laat de geschiedenistabel vallen.

Laten we het proces eens bekijken – laat de [Land].[Stad] vallen tafel.

Stap 1:Voer het volgende script uit om de SYSTEM_VERSIONING uit te schakelen:

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

Stap 2:Laat de [Land].[Stad] . vallen tabel door het volgende DROP TABLE-statement uit te voeren:

drop table [Country].[tblCity]

Stap 3:Verwijder het [Land].[City_Archive] tabel door de volgende query uit te voeren:

drop table [Country].[City_Archive]

Stap 4:Controleer of de tabel is verwijderd door de volgende query uit te voeren:

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

Uitgang:

Zoals je kunt zien, is de tafel gevallen.

Samenvatting

De DROP TABLE-instructie is nodig wanneer we bepaalde tabellen definitief uit de database moeten verwijderen. Het gebruik van deze verklaring heeft echter zijn eigenaardigheden. We hebben verschillende standaard use-cases onderzocht en mogelijke problemen die zich voordoen tijdens de taken.

We hebben ook geleerd hoe we de DROP TABLE-instructie kunnen toepassen om een ​​enkele tabel, een tabel met een externe sleutel en de tijdelijke tabel met systeemversie te verwijderen. Ik hoop dat dit artikel nuttig is.

Lees ook

SQL DROP TABLE-instructie en verschillende gebruiksscenario's


  1. pg_restore Alternatieven - PostgreSQL-back-up en automatisch herstel met ClusterControl

  2. TLS inschakelen in Oracle Apps R12.2

  3. Top 18 gratis en veelgebruikte, open source NoSQL-databases

  4. CURRENT_TIMESTAMP Voorbeelden – MySQL