sql >> Database >  >> RDS >> Database

SQL DROP-index, DROP-tabel en DROP-databaseverklaringen uitgelegd met voorbeelden

De SQL DROP-instructie is een opdracht die bestaande databasecomponenten of de volledige databases met al hun gegevens permanent verwijdert. Er zijn andere SQL-commando's met een soortgelijk effect (TRUNCATE of DELETE), maar het specifieke van het DROP-commando is dat het alles in één keer verwijdert. DROP TABLE verwijdert bijvoorbeeld de tabelgegevens, indexen, triggers, machtigingen, beperkingen - het volledige schema van de tabel.

De DROP-instructie vereist dat men uiterst voorzichtig is bij het gebruik ervan. Eenmaal uitgevoerd, kan het niet worden teruggedraaid. De informatie is voorgoed verloren. De enige kans om de gegevens terug te geven, is door een back-up te herstellen. Toch moeten we in veel gevallen DROP-statements toepassen. Dit artikel gaat in op dergelijke gevallen, de specifieke DROP-varianten en hoe u ze veilig kunt gebruiken.

Voorbereidingen

Om onze gevallen te onderzoeken, hebben we een database met de gegevens nodig. Ik heb een testdatabase gemaakt met de naam EltechEmployees met de volgende vraag:

USE [master] 
go 
CREATE DATABASE [EltechEmployees] 
go

In die database heb ik een tabel gemaakt tblEmployees – daarvoor dient de volgende vraag:

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 

De volgende stap is het maken van twee niet-geclusterde indexen en één geclusterde index op de tblEmployees tafel.

  • Niet-geclusterde indexen:IDX_tblEmployees_loginID en IDX_tblEmployees_nationalidnumber
  • Eén geclusterde index:IDX _tblEmployees_gender

Gebruik de volgende query om deze indexen te maken:

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

Laten we de indexen bekijken die we hebben gemaakt:

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

Uitvoer

Nu kunnen we overgaan tot de praktische voorbeelden.

Indexverklaring laten vallen

Ons eerste geval is het laten vallen van indexen uit een tabel.

Voorbeeld 1:Verwijder een of meerdere indexen van de tabel

De syntaxis om meerdere indexen te verwijderen is als volgt:

Drop index 
[IndexName] on [SchemaName].[TableName] ,
[IndexName] on [SchemaName].[TableName] 
  • Indexnaam: Specificeer de indexnaam die u wilt verwijderen na de Drop Index-instructie .
  • [Schemanaam].[Tabelnaam]: Geef de databasenaam, schemanaam en tabelnaam op. Met de instructie Drop table kunt u de tweedelige naam van elk databaseobject gebruiken. De waarden van [SchemaName].[TableName] moet worden opgegeven na het ON-zoekwoord .

Stel dat we IX_loginID_tblEmployees willen verwijderen en IDX_nationalidnumber_tblEmployees op de tblEmployees tafel. Voer hiervoor de onderstaande query uit:

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

Zodra indexen zijn verwijderd, voert u de volgende query uit om ze te bekijken:

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

Uitvoer

Voorbeeld 2:Drop Index met MAXDOP en ONLINE-optie.

We kunnen de MAXDOP- en ONLINE-opties gebruiken terwijl we de index laten vallen.

Opmerking :We kunnen alleen geclusterde index verwijderen met behulp van MAXDOP en ONLINE opties.

De syntaxis is als volgt:

DROP Index [indexName] on [schemaname].[tablename] with (MAXDOP = @maxdop_val, ONLINE = @online_option)
  • Indexnaam: Geef de indexnaam op die u wilt verwijderen.
  • [Schemanaam].[Tabelnaam]: Geef de driedelige naam van de tabel op.
  • @MaxDop_val: Specificeer de waarde van de MAXDOP-parameter.
  • @online_option: De geldige waarden zijn AAN en UIT.

Stel dat we de PK_Employee_BusinessEntityID willen laten vallen index met MAXDOP en ONLINE opties.

Verlaag de index met de waarde van de MAXDOP-optie naar 5 en de ONLINE-optie is AAN. De vraag om de index te verwijderen is als volgt:

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

Alle indexen zijn verwijderd uit de tblEmployees tafel.

SQL Drop Table-instructie

De DROP TABLE-instructie verwijdert de tabel uit elke database. De syntaxis van de DROP TABLE is als volgt:

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

[DatabaseNaam].[SchemaNaam].[TabelNaam]: Geef de tabelnaam op. U kunt de driedelige naam van de tabel gebruiken.

Machtigingen

De gebruiker moet de ALTER . hebben toestemming voor het schema waar de tabel is gemaakt en de Control toestemming op de tafel, of wees lid van de db_ddladmin vaste rol.

Opmerking:

  1. Als u een tabel verwijdert waarnaar wordt verwezen door een externe sleutel, moet u eerst die verwijzingstabel verwijderen.
  2. Als u een tabel verwijdert met een kolom met het kenmerk FILESTREAM, worden de gegevens die in het bestandssysteem zijn opgeslagen niet verwijderd.

Voorbeeld 1:Zet een fysieke tafel neer

In het volgende voorbeeld laten we de tabel met de naam tblEmployees vallen van de EltechEmployees databank:

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

Voorbeeld 2:Een tijdelijke tafel neerzetten

Hier laten we een tijdelijke tafel vallen. Ik heb een tijdelijke tabel gemaakt met de naam #tblEmployee door de volgende code uit te voeren:

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

Voordat we de tabel laten vallen, controleren we het bestaan ​​van de tijdelijke tabel. Als de tafel wordt gevonden, wordt deze verwijderd.

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

Dus de tijdelijke tabel #tblEmployees zal worden verwijderd.

Drop Database Statement

Drop database statement werkt om de hele database te laten vallen. De syntaxis is als volgt:

Drop database [DatabaseName]

[Databasenaam] :Specificeer de naam van de databasenaam die u wilt verwijderen.

Machtigingen

Om de database te laten vallen, heb je de CONTROL . nodig of ELKE DATABASE WIJZIGEN toestemming voor de database. Of u moet lid zijn van de db_owner vaste databaserol.

Opmerkingen :

  1. Als we een database in de ONLINE plaatsen staat, zal de SQL Server de databasebestanden van de schijf laten vallen. Als u de database echter laat vallen in de OFFLINE staat, laat de SQL Server de databasebestanden niet vallen. We moeten ze handmatig verwijderen.
  2. Als we de database willen verwijderen die is gepubliceerd voor transactie of die is gepubliceerd/geabonneerd op de samenvoegreplicatie, moeten we de replicatie vernietigen en vervolgens de database verwijderen.
  3. Als gebruikers zijn verbonden met de database, kunnen we de database niet verwijderen. Eerst moeten we de status wijzigen in SINGLE_USER .

Voorbeeld:verwijder de database die wordt gebruikt

We willen de EltechEmployees laten vallen databank. Voer hiervoor de volgende query uit:

USE master 
go 
DROP DATABASE [EltechEmployees] 

Als gebruikers zijn verbonden met de database, zult u de volgende fout tegenkomen:

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

Om de fout te herstellen, moeten we de volgende query uitvoeren:

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

De bovenstaande query zet de database in de SINGLE_USER modus en verwijdert alle gebruikers die verbonden zijn met de database.

Laten we nu het DROP DATABASE-statement uitvoeren:

USE master 
go 
DROP DATABASE [EltechEmployees] 

Uitvoer

Zoals je kunt zien, is de opdracht met succes uitgevoerd.

Samenvatting

Daarom hebben we de specifieke varianten van de SQL DROP-instructie voor DROP INDEX, DROP TABLE en DROP DATABASE onderzocht. Ik hoop dat de praktische voorbeelden in dit artikel hebben geholpen om uit te leggen hoe en wanneer deze commando's moeten worden toegepast.


  1. Wat is een ODBC-compatibele database?

  2. Hoe weet ik wanneer mijn docker mysql-container actief is en mysql klaar is om vragen te beantwoorden?

  3. Er zijn geen primaire of kandidaat-sleutels in de tabel waarnaar wordt verwezen die overeenkomen met de lijst met verwijzende kolommen in de externe sleutel

  4. Verouderde functies om uit uw gereedschapskist te halen - Deel 2