Database
 sql >> Baza danych >  >> RDS >> Database

SQL DROP Index, DROP Table i instrukcje bazy danych DROP wyjaśnione na przykładach

Instrukcja SQL DROP to polecenie, które trwale usuwa istniejące komponenty bazy danych lub całe bazy danych ze wszystkimi ich danymi. Istnieją inne polecenia SQL o podobnym działaniu (TRUNCATE lub DELETE), ale specyfika polecenia DROP polega na tym, że usuwa wszystko na raz. Na przykład DROP TABLE usuwa dane z tabeli, indeksy, wyzwalacze, uprawnienia, ograniczenia – cały schemat tabeli.

Instrukcja DROP wymaga od nas szczególnej ostrożności podczas korzystania z niej. Po wykonaniu nie można go cofnąć. Informacje giną na dobre. Jedyną szansą na zwrócenie danych będzie przywrócenie kopii zapasowej. Mimo to w wielu przypadkach musimy zastosować instrukcje DROP. W tym artykule skupimy się na takich przypadkach, konkretnych wariantach DROP i jak ich bezpiecznie używać.

Przygotowania

Aby zbadać nasze przypadki, potrzebujemy bazy danych z danymi. Utworzyłem testową bazę danych o nazwie EltechEmployees z następującym zapytaniem:

USE [master] 
go 
CREATE DATABASE [EltechEmployees] 
go

W tej bazie danych utworzyłem tabelę tblEmployees – służy do tego następujące zapytanie:

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 

Następnym krokiem jest utworzenie dwóch indeksów nieklastrowych i jednego indeksu klastrowego w tblEmployees tabela.

  • Indeksy nieklastrowe:IDX_tblEmployees_loginID orazIDX_tblEmployees_nationalidnumber
  • Jeden indeks klastrowy:IDX _tblEmployees_gender

Aby utworzyć te indeksy, użyj następującego zapytania:

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

Zobaczmy utworzone przez nas indeksy:

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

Wyjście

Teraz możemy przejść do praktycznych przykładów.

Oświadczenie o odrzuceniu indeksu

Naszym pierwszym przypadkiem jest usuwanie indeksów z tabeli.

Przykład 1:Usuń jeden lub wiele indeksów z tabeli

Składnia usuwania wielu indeksów jest następująca:

Drop index 
[IndexName] on [SchemaName].[TableName] ,
[IndexName] on [SchemaName].[TableName] 
  • Nazwa indeksu: Określ nazwę indeksu, który chcesz usunąć po oświadczeniu Indeks odrzucenia .
  • [SchemaName].[TableName]: Określ nazwę bazy danych, nazwę schematu i nazwę tabeli. Instrukcja Drop table umożliwia użycie dwuczęściowej nazwy dowolnego obiektu bazy danych. Wartości [SchemaName].[TableName] należy określić po słowie kluczowym ON .

Załóżmy, że chcemy porzucić IX_loginID_tblEmployees i IDX_nationalidnumber_tblEmployees na tabeliEmployees stół. Aby to zrobić, uruchom poniższe zapytanie:

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

Po upuszczeniu indeksów uruchom następujące zapytanie, aby je wyświetlić:

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

Wyjście

Przykład 2:spadek indeksu z MAXDOP i opcją ONLINE.

Podczas upuszczania indeksu możemy użyć opcji MAXDOP i ONLINE.

Uwaga :Możemy usunąć tylko indeks klastrowy za pomocą opcji MAXDOP i ONLINE.

Składnia jest następująca:

DROP Index [indexName] on [schemaname].[tablename] with (MAXDOP = @maxdop_val, ONLINE = @online_option)
  • Nazwa indeksu: Określ nazwę indeksu, który chcesz usunąć.
  • [SchemaName].[TableName]: Podaj trzyczęściową nazwę tabeli.
  • @MaxDop_val: Określ wartość parametru MAXDOP.
  • @online_option: Prawidłowe wartości to ON i OFF.

Załóżmy, że chcemy usunąć PK_Employee_BusinessEntityID indeksuj z opcjami MAXDOP i ONLINE.

Upuść indeks przy użyciu wartości opcji MAXDOP do 5, a opcja ONLINE jest WŁĄCZONA. Zapytanie o usunięcie indeksu jest następujące:

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

Wszystkie indeksy zostały usunięte z tblEmployees tabela.

Instrukcja tabeli usuwania SQL

Instrukcja DROP TABLE usuwa tabelę z dowolnej bazy danych. Składnia DROP TABLE jest następująca:

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

[DatabaseName].[SchemaName].[TableName]: Podaj nazwę tabeli. Możesz użyć trzyczęściowej nazwy tabeli.

Uprawnienia

Użytkownik musi mieć ALTER uprawnienia do schematu, w którym utworzono tabelę, oraz Kontrola uprawnienia do tabeli lub być członkiem db_ddladmin stała rola.

Uwaga:

  1. Jeśli usuniesz tabelę, do której odwołuje się klucz obcy, musisz najpierw usunąć tę tabelę odniesienia.
  2. Gdy usuniesz tabelę z kolumną mającą atrybut FILESTREAM, dane przechowywane w systemie plików nie zostaną usunięte.

Przykład 1:Upuść tabelę fizyczną

W poniższym przykładzie usuwamy tabelę o nazwie tblEmployees od Pracowników Eltech baza danych:

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

Przykład 2:Upuść tymczasowy stół

Tutaj usuwamy tabelę tymczasową. Utworzyłem tabelę tymczasową o nazwie #tblEmployee wykonując następujący kod:

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

Przed upuszczeniem tabeli sprawdzamy istnienie tabeli tymczasowej. Jeśli tabela zostanie znaleziona, zostanie usunięta.

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

Dlatego tymczasowa tabela #tblEmployees zostanie usunięty.

Oświadczenie o porzuceniu bazy danych

Instrukcja Drop database powoduje usunięcie całej bazy danych. Składnia jest następująca:

Drop database [DatabaseName]

[Nazwa bazy danych] :Określ nazwę bazy danych, którą chcesz usunąć.

Uprawnienia

Aby usunąć bazę danych, potrzebujesz KONTROLI lub ZMIENIAJ DOWOLNĄ BAZĘ DANYCH uprawnienia do bazy danych. Lub musisz być członkiem db_owner stała rola bazy danych.

Notatki :

  1. Kiedy usuniemy jakąkolwiek bazę danych w ONLINE stan, SQL Server usunie pliki bazy danych z dysku. Jeśli jednak upuszczasz bazę danych w OFFLINE stan, SQL Server nie usuwa plików bazy danych. Musimy je usunąć ręcznie.
  2. Aby usunąć bazę danych opublikowaną do celów transakcyjnych lub opublikowaną/zasubskrybowaną do replikacji scalającej, musimy zniszczyć replikację, a następnie usunąć bazę danych.
  3. Jeśli użytkownicy są połączeni z bazą danych, nie możemy usunąć bazy danych. Najpierw musimy zmienić jego stan na SINGLE_USER .

Przykład:usuń używaną bazę danych

Chcemy odrzucić pracowników Eltech Baza danych. Aby to zrobić, uruchom następujące zapytanie:

USE master 
go 
DROP DATABASE [EltechEmployees] 

Jeśli użytkownicy są połączeni z bazą danych, wystąpi następujący błąd:

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

Aby naprawić błąd, musimy wykonać następujące zapytanie:

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

Powyższe zapytanie ustawia bazę danych w SINGLE_USER trybu i odrzuca wszystkich użytkowników podłączonych do bazy danych.

Teraz uruchommy instrukcję DROP DATABASE:

USE master 
go 
DROP DATABASE [EltechEmployees] 

Wyjście

Jak widać, polecenie zostało wykonane pomyślnie.

Podsumowanie

Dlatego zbadaliśmy specyficzne warianty instrukcji DROP INDEX, DROP TABLE i DROP DATABASE instrukcji SQL DROP. Mam nadzieję, że praktyczne przykłady przedstawione w tym artykule pomogły wyjaśnić, jak i kiedy zastosować te polecenia.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Instrukcja SQL SELECT INTO

  2. Co robią wirtualne statystyki plików, a czego nie, informują o opóźnieniach we/wy

  3. SQL AS:użycie, przykłady i najlepsze korzyści

  4. Czy przedrostek sp_ nadal jest nie-nie?

  5. Wskazówki dotyczące przechowywania kopii zapasowych danych TimescaleDB w chmurze