sql >> Databáze >  >> RDS >> Database

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

SQL příkaz DROP TABLE slouží k odstranění tabulky z databáze. Odebere tabulku a její data a indexy s ní spojené. Výrok je nevratný. Tabulku tedy můžete obnovit pouze obnovením zálohy.

Tento článek popisuje následující případy:

  1. Smažte jednu nebo více tabulek.
  2. Smažte tabulku použitou v zobrazení.
  3. Smažte tabulku s cizím klíčem.
  4. Smažte tabulku s indexy seskupenými a neshlukovanými.
  5. Odstranit tabulku z nastavení replikace.

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

IF EXISTS DROP TABLE [DatabaseName].[SchemaName].[TableName]

Poznámka:Pokud používáte SQL Server 2016 a vyšší, můžete zadat IF EXISTS před DROP TABLE prohlášení.

Za příkazem DROP TABLE také zadáte název tabulky. Formát názvu tabulky by měl být [Název databáze].[Název schématu].[Název tabulky].

Jednoduchý příklad příkazu DROP TABLE

Pro ukázku jsem obnovil AdventureWorks2017 databáze na mé pracovní stanici. Zde vymažu zaměstnance tabulka.

Použijte následující dotaz použitý k odstranění tabulky:

DROP TABLE [AdventureWorks2017].[dbo].[employees]

Nainstaloval jsem nástroje Devart dbForge SQL Complete v SQL Server Management Studio. Když spustím příkaz SQL DROP TABLE, zobrazí se dialogové okno pro potvrzení, jak je znázorněno níže:

Klikněte na Přesto provést . Tabulka je zrušena.

Pro ověření spusťte následující dotaz:

SELECT * FROM dbo. employee

Pokud byla tabulka úspěšně zrušena, zobrazí se následující chyba:

Msg 208, Level 16, State 1, Line 1
Invalid object name 'dbo.employee'.

Zrušte tabulku použitou v zobrazení

Zde se pokusíme vypustit tabulku použitou v pohledu na databázi. Spuštěním následujícího skriptu vytvořte pohled s názvem vPerson :

CREATE VIEW vPerson 
AS
SELECT * FROM Person p

Spusťte DROP TABLE příkaz k odebrání osoby tabulka:

DROP TABLE [AdventureWorks2017].[dbo].[person]

Jakmile je tabulka zrušena, spusťte dotaz SELECT a naplňte data z vPerson . Vyvolá to chybu:

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.

K této chybě dochází, když je zrušen objekt, na kterém je zobrazení závislé.

Zrušte tabulku s cizím klíčem

Pokud jste v tabulce vytvořili cizí klíč, nemůžete zrušit nadřazenou tabulku před zrušením podřízené tabulky. To znamená, že nejprve musíte zrušit podřízenou tabulku nebo cizí klíč, který odkazuje na podřízenou tabulku.

Existují dvě tabulky s názvem tblstudent a tblSchool – diagram ER je následující:

Poznámka :Používám dbForge Studio pro SQL Server 2019 k vytvoření databázového diagramu – poskytuje vhodný náhled do struktury tabulky se všemi jejími prvky a entitami mezi tabulkami.

Následující dotaz vytvoří tabulky s názvem tblstudent a tblSchool a jejich primární klíče a cizí klíče:

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

Spuštěním následujícího dotazu zrušte tblstudent tabulka:

Drop table [tblSchool]

Dotaz vrátí následující chybu:

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

V našem demu, pokud chcete zahodit tblschool tabulky, musíte zrušit tblstudent nejprve stůl. Podívejte se na dotaz k vypuštění tblStudent a tblschool tabulka:

Drop table [tblSchool]
Go
Drop table [tblStudent]
Go

Je také možné zrušit dávkovou tabulku jedním příkazem DROP TABLE. Spusťte dotaz takto:

Drop table [tblSchool], [tblStudent]

Vypustit tabulku s indexy

Podívejme se na další scénář chování příkazu DROP TABLE. Předpokládejme, že jsme vytvořili tabulku s názvem tblstudent. Má seskupený a neshlukovaný index.

Když zrušíme tabulku pomocí DROP TABLE, odstraní to indexy? Pojďme to zkontrolovat. Vytvořil jsem tabulku s názvem tblStudent který má jeden seskupený a jeden neseskupený index. Dotaz je následující:

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

Seznam indexů můžeme zobrazit dotazem na sys.indexes DMV.

Po zrušení tabulky spusťte následující dotaz:

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')  

Výstup:

Jak vidíte, pro tblStudent jsme vytvořili jak klastrované, tak neklastrované indexy tabulka.

Nyní spusťte následující příkaz k odstranění tabulky:

Drop table tblStudent

Znovu spusťte stejný dotaz, který jsme použili k naplnění seznamu indexů:

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')  

Výstup:

Výše uvedený snímek obrazovky ukazuje, že dotaz vrátil prázdnou sadu výsledků. Když tedy zrušíme tabulku, zahodí i indexy přidružené k této tabulce.

Vypustit tabulku z replikace

Předpokládejme, že chcete zrušit tabulku, která je součástí replikace. V tomto případě musíte provést další kroky.

Nakonfiguroval jsem replikaci mezi dvěma instancemi SQL Server 2019 s názvem SQL01 a SQL02. Dále jsem replikoval tblStudent a tblSchool tabulky.

Tabulku tblSchool zrušíme z SQL01 provedením následujícího dotazu:

use codingsight
go
drop table tblSchool

Výstup:

Msg 3724, Level 16, State 3, Line 3
Cannot drop the table 'tblSchool' because it is being used for replication.

Výše uvedená chyba je vysvětlující. Chcete-li tabulku zrušit, musíme ji nejprve odstranit z replikace:

  1. Otevřete SQL Server Management Studio a připojte se k SQL01.
  2. Rozbalte Replikace -> Rozbalte Místní publikace .
  3. Klikněte pravým tlačítkem na Publikace a vyberte Vlastnosti .

V části Vlastnosti publikace klikněte na Články .

Zde vidíte seznam stolů. Zrušte zaškrtnutí u tblSchool tabulky a klikněte na OK .

Poznámka: Když článek vypustíte z replikace, předchozí snímky se stanou neplatnými. Po stažení článku musíte vygenerovat nový snímek.

Jakmile je tabulka odebrána z replikace, spusťte DROP TABLE příkaz na SQL01 :

use codingsight
go
drop table tblSchool

Výstup:

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


  1. Kód chyby 1292 – zkrácená nesprávná hodnota DOUBLE – Mysql

  2. Integrace SQLCipher s greenDAO

  3. Oracle.DataAccess.Client.OracleException ORA-03135:kontakt ztraceného připojení

  4. Postgres - FATAL:databázové soubory nejsou kompatibilní se serverem