Инструкцията на SQL DROP TABLE служи за премахване на таблицата от базата данни. Той премахва таблицата и нейните данни и индекси, свързани с нея. Изявлението е необратимо. По този начин можете да възстановите таблицата само като възстановите архива.
Тази статия обхваща следните случаи:
- Изтрийте една или няколко таблици.
- Изтрийте таблицата, използвана в изглед.
- Изтрийте таблицата с външен ключ.
- Изтрийте таблицата с клъстерирани и неклъстерирани индекси.
- Изтрийте таблицата от настройката за репликация.
Синтаксисът на израза DROP TABLE е следният:
IF EXISTS DROP TABLE [DatabaseName].[SchemaName].[TableName]
Забележка:Ако използвате SQL Server 2016 и по-нова версия, можете да посочите АКО СЪЩЕСТВУВА преди DROP TABLE изявление.
Също така, вие посочвате името на таблицата след израза DROP TABLE. Форматът на името на таблицата трябва да бъде [Име на база данни].[Име на схема].[Име на таблица].
Прост пример за израза DROP TABLE
За демонстрацията възстанових AdventureWorks2017 база данни на моята работна станция. Ето, ще изтрия сслужителите таблица.
Използвайте следната заявка, използвана за премахване на таблицата:
DROP TABLE [AdventureWorks2017].[dbo].[employees]
Инсталирах инструментите Devart dbForge SQL Complete в SQL Server Management Studio. Когато изпълня SQL оператор DROP TABLE, той подканва диалогов прозорец за потвърждение, както е показано по-долу:

Кликнете върху Изпълни все пак . Таблицата е отпаднала.
За да потвърдите, изпълнете следната заявка:
SELECT * FROM dbo. employee
Ако изхвърли таблицата успешно, ще получите следната грешка:
Msg 208, Level 16, State 1, Line 1
Invalid object name 'dbo.employee'.
Изхвърлете таблицата, използвана в изглед
Тук ще се опитаме да пуснем таблица, използвана в изглед на база данни. Изпълнете следния скрипт, за да създадете изглед с име vPerson :
CREATE VIEW vPerson
AS
SELECT * FROM Person p
Стартирайте DROP TABLE команда за премахване на Лицето таблица:
DROP TABLE [AdventureWorks2017].[dbo].[person]
След като таблицата бъде премахната, изпълнете заявката SELECT, за да попълните данните от vPerson . Това ще доведе до грешка:
Msg 208, Level 16, State 1, Procedure vPerson, Line 3 [Batch Start Line 0]
Invalid object name 'Person'.
Msg 4413, Level 16, State 1, Line 1
Could not use the view or function 'vPerson' because of binding errors.
Тази грешка възниква, когато обектът, от който зависи изгледът, бъде отхвърлен.
Изхвърлете таблицата с външен ключ
Ако сте създали външен ключ в таблица, не можете да пуснете родителската таблица, преди да изхвърлите дъщерната таблица. Това означава, че първо трябва да премахнете дъщерната таблица или външния ключ, който препраща към дъщерната таблица.
Има две таблици с име tblstudent иtblSchool – диаграмата на ER е следната:

Забележка :Използвам dbForge Studio за SQL Server 2019 за създаване на диаграма на база данни – тя дава подходяща представа за структурата на таблицата с всички нейни елементи и връзките на обекта между таблиците.
Следната заявка създава таблиците с име tblstudent иtblSchool и техните първични и външни ключове:
CREATE TABLE tblSchool
(
SchoolID INT identity(1,1),
SchoolName VARCHAR(500),
City varchar(250),
CONSTRAINT PK_SchoolID PRIMARY KEY (SchoolID)
)
GO
CREATE TABLE tblStudent
(
StudentID INT IDENTITY(1,1) ,
StudentName VARCHAR(250),
StudentGrade CHAR(1),
SchoolID INT,
CONSTRAINT PK_StudentID PRIMARY KEY (StudentID),
Constraint FK_SchoolID FOREIGN KEY (SchoolID) REFERENCES tblSchool (SchoolID)
)
GO
Изпълнете следната заявка, за да премахнете tblstudent таблица:
Drop table [tblSchool]
Заявката връща следната грешка:
Msg 3726, Level 16, State 1, Line 22
Could not drop object 'tblSchool' because it is referenced by a FOREIGN KEY constraint.
В нашата демонстрация, ако искате да се откажете от tblschool таблицата, трябва да пуснете tblstudent първо маса. Разгледайте заявката, за да премахнете tblStudent иtblschool таблица:
Drop table [tblSchool]
Go
Drop table [tblStudent]
Go
Възможно е също така да премахнете пакетната таблица в един оператор DROP TABLE. Изпълнете заявката, както следва:
Drop table [tblSchool], [tblStudent]
Хвърлете таблица с индекси
Нека да наблюдаваме друг сценарий на поведението на оператора DROP TABLE. Да приемем, че сме създали таблица с име tblstudent. Той има клъстериран и неклъстериран индекс.
Когато пуснем таблица с помощта на DROP TABLE, премахва ли индексите? Нека го проверим. Създадох таблица с име tblStudent който има един клъстериран и един неклъстериран индекс. Заявката е следната:
CREATE TABLE tblStudent
(
StudentID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
StudentName VARCHAR(250),
StudentGrade CHAR(1),
SchoolID INT
)
GO
CREATE NONCLUSTERED INDEX IDX_tblStudent_StudentName ON tblStudent(StudentName)
GO
Можем да видим списъка с индексите, като потърсим sys.indexes DMV.
След като таблицата бъде премахната, изпълнете следната заявка:
SELECT Object_name(object_id) AS [Table Name],
NAME AS [Index Name],
type_desc [Index Type]
FROM sys.indexes
WHERE object_id = Object_id('tblStudent')
Изход:

Както можете да видите, създадохме както клъстерираните, така и неклъстерираните индекси за tblStudent таблица.
Сега изпълнете следната команда, за да изтриете таблицата:
Drop table tblStudent
Отново изпълнете същата заявка, която използвахме за попълване на списъка с индекси:
SELECT Object_name(object_id) AS [Table Name],
NAME AS [Index Name],
type_desc [Index Type]
FROM sys.indexes
WHERE object_id = Object_id('tblStudent')
Изход:

Горната екранна снимка илюстрира, че заявката е върнала празен набор от резултати. По този начин, когато пуснем таблица, тя изтрива и индексите, свързани с тази таблица.
Изхвърлете таблица от репликация
Да предположим, че искате да премахнете таблицата, която е част от репликацията. В този случай трябва да изпълните допълнителни стъпки.
Конфигурирах репликация между двата екземпляра на SQL Server 2019, наречени SQL01 и SQL02. След това копирах tblStudent иtblSchool таблици.
Изтриваме таблицата tblSchool от SQL01, като изпълним следната заявка:
use codingsight
go
drop table tblSchool
Изход:
Msg 3724, Level 16, State 3, Line 3
Cannot drop the table 'tblSchool' because it is being used for replication.
Горната грешка е обяснителна. За да премахнем таблицата, първо трябва да я премахнем от репликация:
- Отворете SQL Server Management Studio и се свържете със SQL01.
- Разгънете Репликация -> Разгънете Местна публикация .
- Щракнете с десния бутон върху Публикация и изберете Свойства .

В Свойства на публикация прозорец, щракнете върху Статии .
Там можете да видите списъка с таблици. Премахнете отметката от tblSchool таблица и щракнете върху OK .
Забележка: Когато изхвърлите статията от репликация, предишните моментни снимки стават невалидни. Трябва да генерирате нова моментна снимка, след като пуснете статията.

След като таблицата бъде премахната от репликацията, изпълнете DROP TABLE команда на SQL01 :
use codingsight
go
drop table tblSchool
Изход:

Както можете да видите, таблицата е отпаднала.