sql >> Databáze >  >> RDS >> Sqlserver

Vysvětlení příkazu DROP TABLE na serveru SQL

Příkaz SQL Server DROP TABLE slouží k odstranění tabulky z databáze. Tento článek vysvětlí některé scénáře použití a na příkladech ilustruje práci příkazu DROP TABLE.

Pro demonstraci používáme wideworldimportors demo databáze – můžete si ji stáhnout zde.

Syntaxe příkazu DROP TABLE je následující:

Drop table [Database_name].[Schema_name].[table_name]
  • Název_databáze : název databáze, ze které chcete odstranit tabulku v SQL.
  • Schema_Name : název schématu, pro které tabulka existuje. Pokud jste tabulku vytvořili ve schématu DBO, můžeme tento parametr přeskočit. Pokud je tabulka vytvořena v jiném než výchozím schématu, musíme zadat název názvu schématu.
  • Název_tabulky : název tabulky v SQL nebo MySQL, kterou chcete odstranit.

Když upustíme tabulku, SQL Server provede následující akce:

  1. Zruší tabulku s daty.
  2. Zruší statistiky tabulky.
  3. Zruší indexy, omezení a primární klíč související s danou tabulkou. Pokud máme vztahy s cizím klíčem, musíme podřízenou tabulku zrušit.

Než stůl shodíme, musíme se postarat o následující věci.

  1. Zajistěte, aby byly změněny nebo upraveny uložené procedury, spouštěče a pohledy, které na této tabulce závisí. Potřebné databázové objekty můžete najít pomocí sp_depends uložená procedura.
  2. Vždy používejte [database_name].[schema_name].[table_name] formát, aby se odstranila správná tabulka.
  3. Nezapomeňte, že není možné obnovit konkrétní tabulku ze zálohy SQL Server. Pokud chcete obnovit konkrétní tabulku, musíte si zakoupit nástroje třetích stran. Pokud si myslíte, že tabulka může vyžadovat odkazy nebo vlastní sestavy, ujistěte se, že jste vytvořili zálohu tabulky vytvořením další kopie.

Nastavení ukázky

V ukázce Wideworldimportors databáze, existují tabulky s názvem tblBusinessEntity , tblCountryRegion, tblCity, a tblCustomer .

  • Tabulky tblBusinessEntity a tblCustomer jsou ve výchozím schématu, zatímco tblCountryRegion atblCity jsou v zemi schéma.
  • tblCity je dočasná tabulka s verzí systému.
  • Omezení cizího klíče je mezi tblBusinessEntity a tblCustomer tabulky. Identifikátor BusinessEntityID sloupec tblCustomer odkazy na BusinessEntityID sloupec (Primární klíč) tblBusinessEntity stůl.

Vložil jsem data z AdventureWorks2017 databáze pomocí příkazu INSERT INTO SELECT * FROM.

T-SQL skripty pro přípravu demo nastavení jsou následující:

Use WideworldImportors
go
CREATE SCHEMA [country]
Go

Vytvořte tabulky:

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

Vytvořte index cizího klíče:

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

Vložte data do tabulek:

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

Jakmile jsou skripty spuštěny, můžeme ověřit, zda byly objekty vytvořeny správně a zda byla data vložena do tabulek.

Zkontrolujte tabulky:

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

Výstup:

Získejte počet řádků v tabulkách:

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

Výstup:

Nyní se podívejme na příklady použití DROP TABLE.

Příklad 1:Jednoduchá aplikace příkazu DROP TABLE

Někdy při práci se stolem může dojít k chybě. Stává se to, když se uživatel pokusí DROP tabulku, která neexistuje. Existuje jednoduchý způsob, jak se tomu vyhnout – pomocí příkazu SQL DROP TABLE IF EXISTS.

Syntaxe je následující:

-- use database
USE [MyDatabase];
GO

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

Není třeba ručně kontrolovat, zda tabulka, kterou chcete zrušit, již existuje, protože příkaz DROP TABLE IF EXITS v SQL to udělá za vás.

Pokud potřebujete zahodit všechny tabulky, můžete použít SQL Server Management Studio (SSMS).

Předpokládejme, že chceme vypustit tblCountryRegion tabulky z naší databáze. Za tímto účelem spusťte následující dotaz:

use WideWorldImporters
Go
drop table tblCountryRegion

Obdržíme chybu:

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

Jak již bylo zmíněno dříve, chceme-li zrušit tabulku vytvořenou v jiném než výchozím schématu, musíme zapsat příkaz DROP TABLE do [schéma_název].[název_tabulky] formát .

Spusťte následující dotaz:

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

Výstup:

Commands completed successfully.

Stůl jsme úspěšně zrušili.

Příklad 2:Zrušte tabulku, která má cizí klíč

Zanechme tblBusinessEntity z databáze – spusťte následující dotaz:

use WideWorldImporters
Go
Drop table tblBusinessEntity

Vrací chybu:

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

Když zrušíme tabulku s cizím klíčem, který odkazuje na primární klíč nadřazené tabulky, musíme zrušit nadřazenou tabulku a poté můžeme zrušit podřízenou tabulku.

V našem případě vypustit tblBusinessEntity tabulky, musíme zrušit tblCustomer stůl. Spusťte následující dotaz:

use WideWorldImporters
Go
Drop table tblcustomer

Tím byla tabulka úspěšně vypuštěna.

Po vysazení tblcustomer , spusťte následující příkaz a zrušte tblBusinessEntity tabulka:

use WideWorldImporters
Go
Drop table tblBusinessEntity

Výstup:

Tabulka byla úspěšně zrušena.

Příklad 3:Vypuštění časové tabulky

Časové tabulky s verzí systému se poprvé objevily na serveru SQL Server 2016. Tyto tabulky mohou načíst odstraněná a aktualizovaná data, protože tabulka historie sleduje změny, ke kterým došlo v časové tabulce. Další informace o konceptu časových tabulek naleznete v části Začínáme s dočasnými tabulkami verze systému.

Zahození dočasných tabulek se liší od procesu zrušení obvyklé tabulky. Musíme provést následující kroky:

  1. Vypněte SYSTEM_VERSIONING.
  2. Zrušte časovou tabulku.
  3. Zrušte tabulku historie.

Podívejme se na proces – vypusťte [Country].[City] tabulka.

Krok 1:Spuštěním následujícího skriptu vypněte SYSTEM_VERSIONING:

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

Krok 2:Přetáhněte [Země].[Město] tabulky spuštěním následujícího příkazu DROP TABLE:

drop table [Country].[tblCity]

Krok 3:Přetáhněte [Country].[City_Archive] tabulky spuštěním následujícího dotazu:

drop table [Country].[City_Archive]

Krok 4:Ověřte, že tabulka byla zrušena provedením následujícího dotazu:

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

Výstup:

Jak můžete vidět, tabulka byla zrušena.

Shrnutí

Příkaz DROP TABLE je nezbytný, když potřebujeme odstranit určité tabulky z databáze navždy. Použití tohoto prohlášení má však své zvláštnosti. Prozkoumali jsme několik standardních případů použití a možné problémy, ke kterým dochází během úkolů.

Také jsme se naučili, jak použít příkaz DROP TABLE k odstranění jedné tabulky, tabulky s cizím klíčem a dočasné tabulky s verzí systému. Doufám, že vám tento článek pomůže.

Přečtěte si také

Příkaz SQL DROP TABLE a různé případy použití


  1. SQL SELECT AND operátor

  2. Jak naprogramovat spouštěč MySQL pro vložení řádku do jiné tabulky?

  3. Proč v dotazech MySQL používat join místo kde?

  4. Jak vypočítat průměr sloupce a poté jej zahrnout do výběrového dotazu v oracle?