Инструкцията DROP TABLE на SQL Server служи за премахване на таблицата от базата данни. Тази статия ще обясни някои сценарии на използване и ще илюстрира с примери работата на оператора DROP TABLE.
За демонстрация използваме wideworldimportors демо база данни – можете да я изтеглите от тук.
Синтаксисът на израза DROP TABLE е както следва:
Drop table [Database_name].[Schema_name].[table_name]
- Име на база_данни : името на базата данни, от която искате да изтриете таблицата в SQL.
- Име_на_схема : името на схемата, за която съществува таблицата. Ако сте създали таблицата в DBO схемата, можем да пропуснем този параметър. Ако таблицата е създадена в схема, която не е по подразбиране, трябва да посочим името на името на схемата.
- Име_на таблица : името на таблицата в SQL или MySQL, която искате да изтриете.
Когато пуснем таблица, SQL Server изпълнява следните действия:
- Изпуска таблицата с данни.
- Изпуска статистическите данни на таблицата.
- Изпуска индекси, ограничения и първичен ключ, свързани с тази таблица. Ако имаме връзки с външни ключове, трябва да махнем дъщерната таблица.
Преди да пуснем масата, трябва да се погрижим за следните неща.
- Уверете се, че съхранените процедури, тригери и изгледи, които зависят от тази таблица, се променят или модифицират. Можете да намерите необходимите обекти на базата данни с помощта на sp_depends съхранена процедура.
- Винаги използвайте [име_на_база_данни].[име_на_схема].[име_на_таблица] форматирайте, за да изпуснете правилната таблица.
- Не забравяйте, че е невъзможно да се възстанови конкретната таблица от архива на SQL Server. Ако искате да възстановите конкретна таблица, трябва да закупите инструменти на трети страни. Ако смятате, че таблицата може да изисква препратки или персонализирано отчитане, уверете се, че генерирате резервно копие на таблицата, като създадете друго копие.
Настройка на демонстрация
В демоWideworldimportors база данни, има таблици с име tblBusinessEntity , tblCountryRegion, tblCity, иtblCustomer .
- Таблиците tblBusinessEntity иtblCustomer са в схемата по подразбиране, докато tblCountryRegion иtblCity са встрана схема.
- tblCity е времева таблица с версия на системата.
- Ограничението за външния ключ е между tblBusinessEntity иtblCustomer маси. BusinessEntityID колона на tblCustomer препратки към BusinessEntityID колона (първичен ключ) на tblBusinessEntity маса.
Вмъкнах данни от AdventureWorks2017 база данни с помощта на оператора INSERT INTO SELECT * FROM.
T-SQL скриптовете за подготовка на демонстрационната настройка са както следва:
Use WideworldImportors
go
CREATE SCHEMA [country]
Go
Създайте таблиците:
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
Създайте индекса на външния ключ:
Use WideworldImportors
go
ALTER TABLE [tblCustomer] WITH CHECK ADD CONSTRAINT [FK_Person_BusinessEntity_BusinessEntityID] FOREIGN KEY([BusinessEntityID])
REFERENCES [tblBusinessEntity] ([BusinessEntityID])
GO
Вмъкнете данните в таблиците:
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
След като скриптовете се изпълнят, можем да проверим дали обектите са създадени правилно и дали данните са били вмъкнати в таблици.
Проверете таблиците:
Use WideWorldImporters
Go
select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME in ('tblCustomer','tblCountryRegion','tblBusinessEntity')
Go
Изход:
Вземете броя на редовете в таблици:
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
Изход:
Сега нека разгледаме използването на DROP TABLE чрез примери.
Пример 1:Просто прилагане на израза DROP TABLE
Понякога при работа с таблица може да възникне грешка. Това се случва, когато потребителят се опита да ИЗПУСКА таблица, която не съществува. Има лесен начин да избегнете това – с помощта на командата SQL DROP TABLE IF EXISTS.
Синтаксисът е следният:
-- use database USE [MyDatabase]; GO -- attempt to run DROP TABLE only if it exists DROP TABLE IF EXISTS [dbo].[MyTable0]; GO
Няма нужда да проверявате ръчно дали таблицата, която искате да премахнете, вече съществува, защото командата DROP TABLE IF EXITS в SQL ще го направи вместо вас.
Може да използвате SQL Server Management Studio (SSMS), ако трябва да ИЗПУСКАТЕ всички таблици.
Да предположим, че искаме да премахнем tblCountryRegion таблица от нашата база данни. За целта изпълнете следната заявка:
use WideWorldImporters
Go
drop table tblCountryRegion
Получаваме грешката:
Msg 3701, Level 11, State 5, Line 3
Cannot drop the table 'tblCountryRegion' because it does not exist
or you do not have permission.
Както споменахме по-рано, за да премахнем таблицата, създадена в схемата, която не е по подразбиране, трябва да напишем израза DROP TABLE в [schema_name].[table_name] формат .
Изпълнете следната заявка:
use WideWorldImporters
Go
drop table [country].[tblCountryRegion]
Изход:
Commands completed successfully.
Изпуснахме таблицата успешно.
Пример 2:Пуснете таблица, която има външен ключ
Нека пуснем tblBusinessEntity от базата данни – изпълнете следната заявка:
use WideWorldImporters
Go
Drop table tblBusinessEntity
Връща грешката:
Msg 3726, Level 16, State 1, Line 3
Could not drop object 'tblBusinessEntity' because it is referenced
by a FOREIGN KEY constraint.
Когато пуснем таблица с външен ключ, който препраща към първичния ключ на родителската таблица, трябва да премахнем родителската таблица и след това можем да премахнем дъщерната таблица.
В нашия случай, за да премахнете tblBusinessEntity таблица, трябва да премахнем tblCustomer маса. Изпълнете следната заявка:
use WideWorldImporters
Go
Drop table tblcustomer
По този начин таблицата е отпаднала успешно.
След отпадане на tblcustomer , изпълнете следния оператор, за да премахнете tblBusinessEntity таблица:
use WideWorldImporters
Go
Drop table tblBusinessEntity
Изход:
Таблицата е отпаднала успешно.
Пример 3:Пуснете временна таблица
Темпоралните таблици с версия на системата за първи път се появиха в SQL Server 2016. Тези таблици могат да извличат изтрити и актуализирани данни, тъй като таблицата с хронологията проследява промените, настъпили във времевата таблица. Вижте Първи стъпки с временни таблици с версия на системата за повече информация относно концепцията за темпорални таблици.
Отпадането на временни таблици е различно от процеса на отпадане на обикновена таблица. Трябва да изпълним следните стъпки:
- Изключете SYSTEM_VERSIONING.
- Изхвърлете временната таблица.
- Изхвърлете таблицата с историята.
Нека разгледаме процеса – пуснете [Държава].[Град] таблица.
Стъпка 1:Изпълнете следния скрипт, за да изключите SYSTEM_VERSIONING:
Alter table [Country].[tblCity] set ( SYSTEM_VERSIONING = OFF )
Стъпка 2:Пуснете [Държава].[Град] таблица, като изпълните следния оператор DROP TABLE:
drop table [Country].[tblCity]
Стъпка 3:Пуснете [Държава].[Град_Архив] таблица, като изпълните следната заявка:
drop table [Country].[City_Archive]
Стъпка 4:Проверете дали таблицата е отпаднала, като изпълните следната заявка:
Use WideWorldImporters
Go
select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME in ('tblCity')
Изход:
Както можете да видите, таблицата е отпаднала.
Резюме
Инструкцията DROP TABLE е необходима, когато трябва да премахнем определени таблици от базата данни завинаги. Въпреки това, използването на това твърдение има своите особености. Проучихме няколко стандартни случая на използване и възможни проблеми, възникващи по време на задачите.
Научихме също как да приложим оператора DROP TABLE, за да пуснем една таблица, таблица с външен ключ и временна таблица с версия на системата. Надяваме се, че тази статия е полезна.
Прочетете също
Изявление на SQL DROP TABLE и различни случаи на употреба