Instrukcja SQL DROP TABLE służy do usunięcia tabeli z bazy danych. Usuwa tabelę i powiązane z nią dane oraz indeksy. Oświadczenie jest nieodwracalne. Dlatego możesz przywrócić tabelę tylko przez przywrócenie kopii zapasowej.
W tym artykule omówiono następujące przypadki:
- Usuń jedną lub wiele tabel.
- Usuń tabelę używaną w widoku.
- Usuń tabelę z kluczem obcym.
- Usuń tabelę z indeksami klastrowymi i nieklastrowymi.
- Usuń tabelę z ustawień replikacji.
Składnia instrukcji DROP TABLE jest następująca:
IF EXISTS DROP TABLE [DatabaseName].[SchemaName].[TableName]
Uwaga:jeśli używasz SQL Server 2016 lub nowszego, możesz określić JEŻELI ISTNIEJE przed DROP TABLE oświadczenie.
Ponadto określasz nazwę tabeli po instrukcji DROP TABLE. Format nazwy tabeli powinien mieć postać [Nazwa bazy danych].[Nazwa schematu].[Nazwa tabeli].
Prosty przykład instrukcji DROP TABLE
Na potrzeby demonstracji przywróciłem AdventureWorks2017 bazy danych na mojej stacji roboczej. Tutaj usunę pracowników tabela.
Użyj następującego zapytania użytego do usunięcia tabeli:
DROP TABLE [AdventureWorks2017].[dbo].[employees]
Zainstalowałem narzędzia Devart dbForge SQL Complete w SQL Server Management Studio. Kiedy wykonuję instrukcję SQL DROP TABLE, wyświetla się okno dialogowe potwierdzenia, jak pokazano poniżej:
Kliknij Wykonaj mimo to . Tabela została usunięta.
Aby zweryfikować, uruchom następujące zapytanie:
SELECT * FROM dbo. employee
Jeśli pomyślnie upuścił tabelę, pojawi się następujący błąd:
Msg 208, Level 16, State 1, Line 1
Invalid object name 'dbo.employee'.
Upuść tabelę używaną w widoku
Tutaj spróbujemy usunąć tabelę używaną w widoku bazy danych. Wykonaj następujący skrypt, aby utworzyć widok o nazwie vPerson :
CREATE VIEW vPerson
AS
SELECT * FROM Person p
Uruchom DROP TABLE polecenie, aby usunąć osobę tabela:
DROP TABLE [AdventureWorks2017].[dbo].[person]
Po usunięciu tabeli uruchom zapytanie SELECT, aby wypełnić dane z vPerson . Spowoduje to błąd:
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.
Ten błąd występuje, gdy obiekt, od którego zależny jest widok, zostaje usunięty.
Upuść tabelę z kluczem obcym
Jeśli utworzyłeś klucz obcy w tabeli, nie możesz usunąć tabeli nadrzędnej przed usunięciem tabeli podrzędnej. Oznacza to, że musisz najpierw usunąć tabelę podrzędną lub klucz obcy, który odwołuje się do tabeli podrzędnej.
Istnieją dwie tabele o nazwie tblstudent i tblSchool – schemat ER wygląda następująco:
Uwaga :używam dbForge Studio dla SQL Server 2019 stworzyć diagram bazy danych – daje to odpowiedni wgląd w strukturę tabeli ze wszystkimi jej elementami oraz relacje encji między tabelami.
Poniższe zapytanie tworzy tabele o nazwie tblstudent i tblSchool oraz ich klucze podstawowe i obce:
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
Uruchom następujące zapytanie, aby usunąć tablicę studenta tabela:
Drop table [tblSchool]
Zapytanie zwraca następujący błąd:
Msg 3726, Level 16, State 1, Line 22
Could not drop object 'tblSchool' because it is referenced by a FOREIGN KEY constraint.
W naszym demo, jeśli chcesz porzucić tblschool tabeli, musisz usunąć tblstudent pierwszy stół. Spójrz na zapytanie, aby usunąć tblStudent i tblschool tabela:
Drop table [tblSchool]
Go
Drop table [tblStudent]
Go
Możliwe jest również usunięcie tabeli wsadowej za pomocą pojedynczej instrukcji DROP TABLE. Uruchom zapytanie w następujący sposób:
Drop table [tblSchool], [tblStudent]
Upuść tabelę z indeksami
Przyjrzyjmy się kolejnemu scenariuszowi zachowania instrukcji DROP TABLE. Załóżmy, że utworzyliśmy tabelę o nazwie tblstudent. Ma indeks klastrowy i nieklastrowany.
Kiedy usuwamy tabelę za pomocą DROP TABLE, czy usuwa to indeksy? Sprawdźmy to. Utworzyłem tabelę o nazwie tblStudent który ma jeden indeks klastrowany i jeden nieklastrowany. Zapytanie jest następujące:
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
Listę indeksów możemy zobaczyć, sprawdzając sys.indexes DMV.
Po upuszczeniu tabeli uruchom następujące zapytanie:
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')
Wyjście:
Jak widać, utworzyliśmy zarówno indeksy klastrowe, jak i nieklastrowe dla tblStudent tabela.
Teraz uruchom następujące polecenie, aby usunąć tabelę:
Drop table tblStudent
Ponownie uruchom to samo zapytanie, którego użyliśmy do wypełnienia listy indeksów:
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')
Wyjście:
Powyższy zrzut ekranu ilustruje, że zapytanie zwróciło pusty zestaw wyników. Tak więc, kiedy usuniemy tabelę, odrzucą również indeksy związane z tą tabelą.
Usuń tabelę z replikacji
Załóżmy, że chcesz usunąć tabelę, która jest częścią replikacji. W takim przypadku musisz wykonać dodatkowe czynności.
Skonfigurowałem replikację między dwoma instancjami SQL Server 2019 nazwanymi SQL01 i SQL02. Następnie odtworzyłem tblStudent i tblSchool tabele.
Usuwamy tabelę tblSchool z SQL01, wykonując następujące zapytanie:
use codingsight
go
drop table tblSchool
Wyjście:
Msg 3724, Level 16, State 3, Line 3
Cannot drop the table 'tblSchool' because it is being used for replication.
Powyższy błąd jest objaśniający. Aby usunąć tabelę, musimy najpierw usunąć ją z replikacji:
- Otwórz SQL Server Management Studio i połącz się z SQL01.
- Rozwiń Replikacja -> Rozwiń Publikacja lokalna .
- Kliknij prawym przyciskiem myszy Publikacja i wybierz Właściwości .
W Właściwościach publikacji kliknij Artykuły .
Tam możesz zobaczyć listę stołów. Odznacz tblSchool tabeli i kliknij OK .
Uwaga: Po usunięciu artykułu z replikacji poprzednie migawki stają się nieważne. Po upuszczeniu artykułu musisz wygenerować nowy zrzut.
Po usunięciu tabeli z replikacji wykonaj DROP TABLE polecenie na SQL01 :
use codingsight
go
drop table tblSchool
Wyjście:
Jak widać, tabela została usunięta.