sql >> Database teknologi >  >> RDS >> Database

SQL DROP-indeks, DROP-tabel og DROP-databaseerklæringer forklaret med eksempler

SQL DROP-sætningen er en kommando, der sletter eksisterende databasekomponenter eller hele databaserne med alle deres data permanent. Der er andre SQL-kommandoer med en lignende effekt (TRUNCATE eller DELETE), men det særlige ved DROP-kommandoen er, at den sletter alt på én gang. For eksempel fjerner DROP TABLE tabeldata, indekserer, triggere, tilladelser, begrænsninger – hele tabellens skema.

DROP-sætningen kræver, at man er ekstremt forsigtig, når man bruger den. Når den er udført, kan den ikke rulles tilbage. Informationen går tabt for altid. Den eneste chance for at returnere dataene vil være at gendanne en sikkerhedskopi. Alligevel er vi i mange tilfælde nødt til at anvende DROP-udsagn. Denne artikel vil fokusere på sådanne tilfælde, de specifikke DROP-varianter og hvordan man bruger dem sikkert.

Forberedelser

For at undersøge vores sager har vi brug for en database med dataene. Jeg har oprettet en testdatabase ved navn EltechEmployees med følgende forespørgsel:

USE [master] 
go 
CREATE DATABASE [EltechEmployees] 
go
 

I den database har jeg oprettet en tabel tblEmployees – følgende forespørgsel tjener til det:

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 
 

Det næste trin er at oprette to ikke-klyngede indekser og et klynget indeks på tblEmployees tabel.

  • Ikke-klyngede indekser:IDX_tblEmployees_loginID ogIDX_tblEmployees_nationalidnumber
  • Ét klynget indeks:IDX _tblEmployees_gender

For at oprette disse indekser skal du bruge følgende forespørgsel:

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
 

Lad os se de indekser, vi oprettede:

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

Output

Nu kan vi gå videre til de praktiske eksempler.

Drop indekserklæring

Vores første tilfælde er at droppe indeks fra en tabel.

Eksempel 1:Slip et eller flere indekser fra tabellen

Syntaksen til at droppe flere indekser er følgende:

Drop index 
[IndexName] on [SchemaName].[TableName] ,
[IndexName] on [SchemaName].[TableName] 
 
  • Indeksnavn: Angiv det indeksnavn, du vil slette efter Drop Index-erklæringen .
  • [Skemanavn].[Tabelnavn]: Angiv databasenavnet, skemanavnet og tabelnavnet. Drop table-sætningen giver dig mulighed for at bruge det todelte navn på ethvert databaseobjekt. Værdierne for [SchemaName].[TableName] skal angives efter søgeordet ON .

Antag, at vi ønsker at droppe IX_loginID_tblEmployees og IDX_nationalidnumber_tblEmployees tblEmployees bord. For at gøre det skal du køre nedenstående forespørgsel:

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

Når indekser er slettet, skal du køre følgende forespørgsel for at se dem:

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

Output

Eksempel 2:Drop Index med MAXDOP og ONLINE Option.

Vi kan bruge MAXDOP og ONLINE muligheder, mens vi dropper indekset.

Bemærk :Vi kan kun droppe klyngede indeks ved at bruge MAXDOP og ONLINE muligheder.

Syntaksen er som følger:

DROP Index [indexName] on [schemaname].[tablename] with (MAXDOP = @maxdop_val, ONLINE = @online_option) 
  • Indeksnavn: Angiv det indeksnavn, du vil slette.
  • [Skemanavn].[Tabelnavn]: Angiv det tredelte navn på tabellen.
  • @MaxDop_val: Angiv værdien af ​​MAXDOP-parameteren.
  • @online_option: De gyldige værdier er TIL og FRA.

Antag, at vi vil slette PK_Employee_BusinessEntityID indeks med MAXDOP og ONLINE muligheder.

Slip indekset med værdien af ​​MAXDOP-indstillingen til 5, og ONLINE-indstillingen er TIL. Forespørgslen for at slette indekset er følgende:

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

Alle indekser er blevet slettet fra tblEmployees tabel.

SQL Drop Table Statement

DROP TABLE-sætningen sletter tabellen fra enhver database. Syntaksen for DROP TABLE er følgende:

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

[Databasenavn].[Skemanavn].[Tabelnavn]: Angiv tabelnavnet. Du kan bruge tabellens tredelte navn.

Tilladelser

Brugeren skal have ALTER tilladelse til skemaet, hvor tabellen er blevet oprettet, og Kontrol tilladelse på bordet, eller vær medlem af db_ddladmin fast rolle.

Bemærk:

  1. Hvis du slipper en tabel, der refereres til af en fremmednøgle, skal du først slippe den referencetabel.
  2. Når du sletter en tabel med en kolonne med FILESTREAM-attributten, slettes de data, der er gemt i filsystemet, ikke.

Eksempel 1:Slip en fysisk tabel

I det følgende eksempel dropper vi tabellen med navnet tblEmployees fra Eltech-medarbejderne database:

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

Eksempel 2:Slip en midlertidig tabel

Her dropper vi et midlertidigt bord. Jeg har oprettet en vikartabel med navnet #tblEmployee ved at udføre følgende kode:

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
 

Før vi dropper tabellen, tjekker vi eksistensen af ​​temp-tabellen. Hvis tabellen bliver fundet, vil den blive slettet.

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

Således er den midlertidige tabel #tblMedarbejdere vil blive droppet.

Drop databaseerklæring

Drop database-sætning virker til at droppe hele databasen. Syntaksen er følgende:

Drop database [DatabaseName] 

[Databasenavn] :Angiv navnet på det databasenavn, du vil slette.

Tilladelser

For at slette databasen skal du bruge KONTROL eller ÆNDRE ENHVER DATABASE tilladelse til databasen. Eller du skal være medlem af db_owner fast databaserolle.

Bemærkninger :

  1. Når vi dropper en database i ONLINE tilstand, vil SQL-serveren slippe databasefilerne fra disken. Men hvis du dropper databasen i OFFLINE tilstand, taber SQL Server ikke databasefilerne. Vi skal slette dem manuelt.
  2. For at slette databasen, der er publiceret til transaktioner eller offentliggjort/abonneret på flettereplikeringen, skal vi ødelægge replikeringen og derefter slette databasen.
  3. Hvis brugere er forbundet til databasen, kan vi ikke droppe databasen. Først skal vi ændre dens tilstand til SINGLE_USER .

Eksempel:Slip den database, der bliver brugt

Vi ønsker at droppe Eltech-medarbejderne database. For at gøre det skal du køre følgende forespørgsel:

USE master 
go 
DROP DATABASE [EltechEmployees] 
 

Hvis brugere er forbundet til databasen, vil du støde på følgende fejl:

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

For at rette fejlen skal vi udføre følgende forespørgsel:

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

Ovenstående forespørgsel sætter databasen i SINGLE_USER tilstand og sletter alle brugere, der er forbundet til databasen.

Lad os nu køre DROP DATABASE-sætningen:

USE master 
go 
DROP DATABASE [EltechEmployees] 
 

Output

Som du kan se, blev kommandoen udført.

Oversigt

Vi har således undersøgt DROP INDEX, DROP TABLE og DROP DATABASE-sætningerne specifikke varianter af SQL DROP-sætningen. Håber, at de praktiske eksempler præsenteret i denne artikel hjalp med at forklare, hvordan og hvornår man anvender disse kommandoer.


  1. Skift fra MySQL til PostgreSQL - tips, tricks og gode råd?

  2. Hvordan overfører man XML fra C# til en lagret procedure i SQL Server 2008?

  3. Hvornår skal man bruge MyISAM og InnoDB?

  4. SQL Server Inner Join Basics med eksempler