Database
 sql >> база данни >  >> RDS >> Database

SQL DROP индекс, DROP таблица и оператори на базата данни DROP, обяснени с примери

Инструкцията на SQL DROP е команда, която изтрива за постоянно съществуващи компоненти на база данни или цели бази данни с всичките им данни. Има и други SQL команди с подобен ефект (TRUNCATE или DELETE), но спецификата на командата DROP е, че тя изтрива всичко наведнъж. Например, DROP TABLE премахва данните от таблицата, индексите, тригерите, разрешенията, ограниченията – цялата схема на таблицата.

Изявлението DROP изисква човек да бъде изключително внимателен, когато го използва. Веднъж изпълнен, не може да бъде върнат назад. Информацията се губи завинаги. Единствената възможност за връщане на данните ще бъде възстановяването на резервно копие. И все пак, в много случаи трябва да прилагаме DROP оператори. Тази статия ще се фокусира върху такива случаи, конкретните варианти на DROP и как да ги използвате безопасно.

Подготовки

За да разгледаме нашите случаи, ще ни трябва база данни с данните. Създадох тестова база данни с име EltechEmployees със следната заявка:

USE [master] 
go 
CREATE DATABASE [EltechEmployees] 
go

В тази база данни създадох таблица tblEmployees – за това служи следната заявка:

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 

Следващата стъпка е създаването на два неклъстерирани индекса и един клъстериран индекс на tblEmployees таблица.

  • Неклъстерни индекси:IDX_tblEmployees_loginID и IDX_tblEmployees_nationalidnumber
  • Един клъстериран индекс:IDX _tblEmployees_gender

За да създадете тези индекси, използвайте следната заявка:

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

Нека разгледаме индексите, които създадохме:

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

Изход

Сега можем да преминем към практическите примери.

Отпускане на индекса

Първият ни случай е изпускане на индекси от таблица.

Пример 1:Изхвърлете един или няколко индекса от таблицата

Синтаксисът за премахване на множество индекси е следният:

Drop index 
[IndexName] on [SchemaName].[TableName] ,
[IndexName] on [SchemaName].[TableName] 
  • Име на индекс: Посочете името на индекса, което искате да премахнете след оператора Drop Index .
  • [Име на схема].[Име на таблица]: Посочете името на базата данни, името на схемата и името на таблицата. Инструкцията Drop table ви позволява да използвате името от две части на всеки обект на база данни. Стойностите на [SchemaName].[TableName] трябва да се посочи след ключовата дума ON .

Да предположим, че искаме да премахнем IX_loginID_tblEmployees и IDX_nationalidnumber_tblEmployees на tblEmployees маса. За да направите това, изпълнете следната заявка:

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

След като индексите бъдат премахнати, изпълнете следната заявка, за да ги видите:

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

Изход

Пример 2:Изпускане на индекс с MAXDOP и ОНЛАЙН опция.

Можем да използваме опциите MAXDOP и ONLINE, докато пускаме индекса.

Забележка :Можем да премахнем само клъстериран индекс, използвайки опциите MAXDOP и ONLINE.

Синтаксисът е следният:

DROP Index [indexName] on [schemaname].[tablename] with (MAXDOP = @maxdop_val, ONLINE = @online_option)
  • Име на индекс: Посочете името на индекса, което искате да премахнете.
  • [Име на схема].[Име на таблица]: Посочете името на таблицата от три части.
  • @MaxDop_val: Посочете стойността на параметъра MAXDOP.
  • @online_option: Валидните стойности са ВКЛЮЧЕНО и ИЗКЛЮЧЕНО.

Да предположим, че искаме да премахнем PK_Employee_BusinessEntityID индекс с опции MAXDOP и ONLINE.

Пуснете индекса, като използвате стойността на опцията MAXDOP до 5 и опцията ONLINE е ВКЛ. Заявката за премахване на индекса е следната:

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

Всички индекси са премахнати от tblEmployees таблица.

Изявление на SQL Drop Table

Инструкцията DROP TABLE изхвърля таблицата от всяка база данни. Синтаксисът на DROP TABLE е следният:

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

[Име на база данни].[Име на схема].[Име на таблица]: Посочете името на таблицата. Можете да използвате името на таблицата от три части.

Разрешения

Потребителят трябва да има ALTER разрешение за схемата, където е създадена таблицата, и Control разрешение на масата или бъдете член на db_ddladmin фиксирана роля.

Забележка:

  1. Ако махнете таблица, на която се позовава външен ключ, първо трябва да премахнете тази таблица.
  2. Когато пуснете таблица с колона с атрибута FILESTREAM, данните, съхранявани във файловата система, няма да бъдат премахнати.

Пример 1:Пуснете физическа таблица

В следващия пример пускаме таблицата с име tblEmployees от EltechEmployees база данни:

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

Пример 2:Пуснете временна таблица

Тук пускаме временна таблица. Създадох временна таблица с име #tblEmployee като изпълните следния код:

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

Преди да пуснем таблицата, проверяваме съществуването на временната таблица. Ако таблицата бъде намерена, тя ще бъде премахната.

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

Така временната таблица #tblEmployees ще отпадне.

Изхвърлете изявление за база данни

Изявлението Drop база данни работи за изтриване на цялата база данни. Синтаксисът е следният:

Drop database [DatabaseName]

[Име на база данни] :Посочете името на името на базата данни, което искате да премахнете.

Разрешения

За да премахнете базата данни, имате нужда от CONTROL или ПРОМЕНЯТЕ ВСЯКАКВА БАЗА ДАННИ разрешение за базата данни. Или трябва да сте член на db_owner фиксирана роля на базата данни.

Бележки :

  1. Когато пуснем която и да е база данни в ОНЛАЙН състояние, SQL Server ще изхвърли файловете на базата данни от диска. Въпреки това, ако изтривате базата данни в OFFLINE състояние, SQL Server не изпуска файловете на базата данни. Трябва да ги изтрием ръчно.
  2. За да премахнем базата данни, публикувана за транзакции или публикувана/абонирана за репликация при сливане, трябва да унищожим репликацията и след това да премахнем базата данни.
  3. Ако потребителите са свързани към базата данни, не можем да я премахнем. Първо, трябва да променим състоянието му на SINGLE_USER .

Пример:Изхвърлете базата данни, която се използва

Искаме да премахнем EltechEmployees база данни. За да направите това, изпълнете следната заявка:

USE master 
go 
DROP DATABASE [EltechEmployees] 

Ако потребителите са свързани към базата данни, ще срещнете следната грешка:

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

За да коригираме грешката, трябва да изпълним следната заявка:

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

Горната заявка задава базата данни в SINGLE_USER режим и премахва всички потребители, свързани с базата данни.

Сега нека изпълним оператора DROP DATABASE:

USE master 
go 
DROP DATABASE [EltechEmployees] 

Изход

Както можете да видите, командата е изпълнена успешно.

Резюме

По този начин ние разгледахме специфичните варианти на операторите DROP INDEX, DROP TABLE и DROP DATABASE на SQL оператора DROP. Надяваме се, че практическите примери, представени в тази статия, помогнаха да се обясни как и кога да се прилагат тези команди.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Не си ти, аз съм (отстраняване на неизправности при I/O)

  2. Какво е T-SQL?

  3. Проектиране на база данни

  4. SCD тип 3

  5. Как да инсталирате Neo4j на Ubuntu 20.04