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

SQL index DROP, tabulka DROP a příkazy databáze DROP vysvětlené s příklady

SQL příkaz DROP je příkaz, který trvale smaže existující databázové komponenty nebo celé databáze se všemi jejich daty. Existují další SQL příkazy s podobným účinkem (TRUNCATE nebo DELETE), ale specifikum příkazu DROP je v tom, že smaže vše najednou. Například DROP TABLE odstraní data tabulky, indexy, spouštěče, oprávnění, omezení – celé schéma tabulky.

Příkaz DROP vyžaduje, aby byl člověk při jeho používání extrémně opatrný. Po provedení jej nelze vrátit zpět. Informace jsou nadobro ztraceny. Jedinou šancí na vrácení dat bude obnovení zálohy. Přesto v mnoha případech musíme použít příkazy DROP. Tento článek se zaměří na takové případy, konkrétní varianty DROP a na to, jak je bezpečně používat.

Přípravy

K prozkoumání našich případů budeme potřebovat databázi s daty. Vytvořil jsem testovací databázi s názvem EltechEmployees s následujícím dotazem:

USE [master] 
go 
CREATE DATABASE [EltechEmployees] 
go

V této databázi jsem vytvořil tabulku tblEmployees – k tomu slouží následující dotaz:

USE [EltechEmployees] 
go 
CREATE TABLE [tblEmployees] 
  ( 
     [businessentityid] [INT] NOT NULL, 
     [nationalidnumber] [NVARCHAR](15) NOT NULL, 
     [loginid]          [NVARCHAR](256) NOT NULL, 
     [jobtitle]         [NVARCHAR](50) NOT NULL, 
     [birthdate]        [DATE] NOT NULL, 
     [maritalstatus]    [NCHAR](1) NOT NULL, 
     [gender]           [NCHAR](1) NOT NULL, 
     [hiredate]         [DATE] NOT NULL, 
     [vacationhours]    [SMALLINT] NOT NULL, 
     [sickleavehours]   [SMALLINT] NOT NULL, 
     [modifieddate]     [DATETIME] NOT NULL 
     
  ) 
go 

Dalším krokem je vytvoření dvou neklastrovaných indexů a jednoho klastrovaného indexu na tblEmployees tabulka.

  • Indexy bez klastrů:IDX_tblEmployees_loginID aIDX_tblEmployees_nationalidnumber
  • Jeden seskupený index:IDX _tblEmployees_gender

Chcete-li vytvořit tyto indexy, použijte následující dotaz:

USE [EltechEmployees] 
go 
CREATE INDEX [IDX_tblEmployees_loginID]   ON [tblEmployees](loginid) 
go 
CREATE INDEX [IDX_tblEmployees_nationalidnumber]  ON [tblEmployees](nationalidnumber) 
go 
CREATE Clustered INDEX [IDX_tblEmployees_gender]  ON [tblEmployees](gender) 
go

Podívejme se na indexy, které jsme vytvořili:

SELECT Object_name([Index].object_id)                               [Table Name] 
       , 
       [Index].NAME 
       [Index Name] 
       , 
       Col_name([Index Column].object_id, [Index Column].column_id) 
       [Index Column_Name], 
       [Index Column].index_column_id, 
       CASE 
         WHEN is_primary_key = 1 THEN 'Yes' 
         ELSE 'No' 
       END 
       [Is Primary Key], 
       CASE 
         WHEN is_unique = 1 THEN 'Yes' 
         ELSE 'No' 
       END 
       [Is Unique Key] 
FROM   sys.indexes AS [Index] 
       INNER JOIN sys.index_columns AS [Index Column] 
               ON [Index].object_id = [Index Column].object_id 
                  AND [Index].index_id = [Index Column].index_id 
WHERE  [Index].is_hypothetical = 0 
       AND [Index].object_id = Object_id('tblEmployees');

Výstup

Nyní můžeme přejít k praktickým příkladům.

Drop Index Statement

Náš první případ je vypuštění indexů z tabulky.

Příklad 1:Vypuštění jednoho nebo více indexů z tabulky

Syntaxe pro zrušení více indexů je následující:

Drop index 
[IndexName] on [SchemaName].[TableName] ,
[IndexName] on [SchemaName].[TableName] 
  • Název indexu: Zadejte název indexu, který chcete vypustit po příkazu Drop Index .
  • [SchemaName].[TableName]: Zadejte název databáze, název schématu a název tabulky. Příkaz Drop table umožňuje použít dvoudílný název libovolného databázového objektu. Hodnoty [SchemaName].[TableName] musí být uvedeno za klíčovým slovem ON .

Předpokládejme, že chceme vyřadit IX_loginID_tblEmployees a IDX_nationalidnumber_tblEmployees na tblEmployees stůl. Chcete-li to provést, spusťte níže uvedený dotaz:

DROP INDEX 
[IDX_tblEmployees_loginID] ON [dbo].[tblEmployees], 
[IDX_tblEmployees_nationalidnumber] ON [dbo].[tblEmployees] 

Jakmile jsou indexy zrušeny, spusťte následující dotaz a zobrazte je:

SELECT Object_name([Index].object_id)                               [Table Name] 
       , 
       [Index].NAME 
       [Index Name] 
       , 
       Col_name([Index Column].object_id, [Index Column].column_id) 
       [Index Column_Name], 
       [Index Column].index_column_id, 
       CASE 
         WHEN is_primary_key = 1 THEN 'Yes' 
         ELSE 'No' 
       END 
       [Is Primary Key], 
       CASE 
         WHEN is_unique = 1 THEN 'Yes' 
         ELSE 'No' 
       END 
       [Is Unique Key] 
FROM   sys.indexes AS [Index] 
       INNER JOIN sys.index_columns AS [Index Column] 
               ON [Index].object_id = [Index Column].object_id 
                  AND [Index].index_id = [Index Column].index_id 
WHERE  [Index].is_hypothetical = 0 
       AND [Index].object_id = Object_id('tblEmployees'); 

Výstup

Příklad 2:Pokles indexu pomocí MAXDOP a ONLINE Option.

Při odstraňování indexu můžeme použít možnosti MAXDOP a ONLINE.

Poznámka :Můžeme zrušit pouze seskupený index pomocí možností MAXDOP a ONLINE.

Syntaxe je následující:

DROP Index [indexName] on [schemaname].[tablename] with (MAXDOP = @maxdop_val, ONLINE = @online_option)
  • Název indexu: Zadejte název indexu, který chcete odstranit.
  • [SchemaName].[TableName]: Zadejte třídílný název tabulky.
  • @MaxDop_val: Zadejte hodnotu parametru MAXDOP.
  • @online_option: Platné hodnoty jsou ON a OFF.

Předpokládejme, že chceme vypustit PK_Employee_BusinessEntityID index s možnostmi MAXDOP a ONLINE.

Zrušte index pomocí hodnoty možnosti MAXDOP na 5 a možnost ONLINE je zapnutá. Dotaz na zrušení indexu je následující:

DROP INDEX [IDX_tblEmployees_gender] ON [dbo].[tblEmployees] WITH (maxdop=5, 
online=ON)

Všechny indexy byly odstraněny z tblEmployees tabulka.

Příkaz SQL Drop Table

Příkaz DROP TABLE odstraní tabulku z jakékoli databáze. Syntaxe DROP TABLE je následující:

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

[DatabaseName].[SchemaName].[TableName]: Zadejte název tabulky. Můžete použít třídílný název tabulky.

Oprávnění

Uživatel musí mít ALTER oprávnění ke schématu, kde byla tabulka vytvořena, a Ovládací prvek povolení na stůl, nebo být členem db_ddladmin pevná role.

Poznámka:

  1. Pokud zrušíte tabulku, na kterou odkazuje cizí klíč, musíte nejprve zrušit tuto referenční tabulku.
  2. Když zrušíte tabulku se sloupcem s atributem FILESTREAM, data uložená v systému souborů nebudou odstraněna.

Příklad 1:Vypuštění fyzické tabulky

V následujícím příkladu vypouštíme tabulku s názvem tblEmployees od EltechEmployees databáze:

Drop table [EltechEmployees].[dbo].[tblEmployees]

Příklad 2:Vypuštění dočasné tabulky

Zde rušíme dočasnou tabulku. Vytvořil jsem dočasnou tabulku s názvem #tblEmployee spuštěním následujícího kódu:

CREATE TABLE [#tblemployees] 
  ( 
     [businessentityid] [INT] NOT NULL, 
     [nationalidnumber] [NVARCHAR](15) NOT NULL, 
     [loginid]          [NVARCHAR](256) NOT NULL, 
     [jobtitle]         [NVARCHAR](50) NOT NULL, 
     [birthdate]        [DATE] NOT NULL, 
     [maritalstatus]    [NCHAR](1) NOT NULL, 
     [gender]           [NCHAR](1) NOT NULL, 
     [hiredate]         [DATE] NOT NULL, 
     [vacationhours]    [SMALLINT] NOT NULL, 
     [sickleavehours]   [SMALLINT] NOT NULL, 
     [modifieddate]     [DATETIME] NOT NULL 
  ) 
go

Před zrušením tabulky zkontrolujeme existenci dočasné tabulky. Pokud je tabulka nalezena, bude zrušena.

IF Object_id(N'tempdb..#tblEmployees', N'U') IS NOT NULL 
  DROP TABLE #tblemployees; 
go 

Tedy dočasná tabulka #tblEmployees bude zrušeno.

Zrušte příkaz databáze

Příkaz Drop Database funguje tak, že zruší celou databázi. Syntaxe je následující:

Drop database [DatabaseName]

[DatabaseName] :Zadejte název názvu databáze, kterou chcete odstranit.

Oprávnění

Chcete-li databázi zrušit, potřebujete CONTROL nebo ZMĚŇTE JAKOUKOLIV DATABÁZI oprávnění k databázi. Nebo musíte být členem db_owner pevná databázová role.

Poznámky :

  1. Když pustíme jakoukoli databázi do ONLINE stavu, SQL Server stáhne databázové soubory z disku. Pokud však upouštíte databázi do OFFLINE stavu, SQL Server nepustí databázové soubory. Musíme je odstranit ručně.
  2. Chcete-li zrušit databázi publikovanou pro transakční nebo publikovanou/přihlášenou ke slučovací replikaci, musíme replikaci zničit a poté zrušit databázi.
  3. Pokud jsou uživatelé připojeni k databázi, nemůžeme databázi zrušit. Nejprve musíme změnit jeho stav na SINGLE_USER .

Příklad:Zrušte databázi, která se používá

Chceme vyřadit EltechEmployees databáze. Chcete-li to provést, spusťte následující dotaz:

USE master 
go 
DROP DATABASE [EltechEmployees] 

Pokud jsou uživatelé připojeni k databázi, objeví se následující chyba:

Msg 3702, Level 16, State 4, Line 3
Cannot drop database "EltechEmployees" because it is currently in use.

Abychom chybu napravili, musíme provést následující dotaz:

USE [master] 
go 
ALTER DATABASE eltechemployees SET single_user WITH ROLLBACK immediate 

Výše uvedený dotaz nastaví databázi do SINGLE_USER režimu a zruší všechny uživatele připojené k databázi.

Nyní spusťte příkaz DROP DATABASE:

USE master 
go 
DROP DATABASE [EltechEmployees] 

Výstup

Jak vidíte, příkaz byl úspěšně proveden.

Shrnutí

Zkoumali jsme tedy specifické varianty příkazů SQL DROP příkazů DROP INDEX, DROP TABLE a DROP DATABASE. Doufám, že praktické příklady uvedené v tomto článku pomohly vysvětlit, jak a kdy tyto příkazy použít.


  1. Import CSV dat pomocí PHP/MySQL

  2. ORA-00932:nekonzistentní datové typy:očekáváno - dostal CLOB

  3. Jak vytvářet vztahy v MySQL

  4. Získejte ID vloženého řádku pomocí C#