sql >> データベース >  >> RDS >> Database

例を使用して説明されたSQLDROPインデックス、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に2つの非クラスター化インデックスと1つのクラスター化インデックスを作成することです。 テーブル。

    • 非クラスター化インデックス: IDX_tblEmployees_loginID およびIDX_tblEmployees_nationalidnumber
    • 1つのクラスター化されたインデックス: 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:テーブルから1つまたは複数のインデックスを削除する

    複数のインデックスを削除する構文は次のとおりです。

    Drop index 
    [IndexName] on [SchemaName].[TableName] ,
    [IndexName] on [SchemaName].[TableName] 
    
    • IndexName: ドロップするインデックス名をドロップインデックスステートメントの後に指定します 。
    • [SchemaName]。[TableName]: データベース名、スキーマ名、およびテーブル名を指定します。 Drop tableステートメントを使用すると、任意のデータベースオブジェクトの2つの部分からなる名前を使用できます。 [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とONLINEオプションを使用してインデックスを削除します。

    インデックスを削除しながら、MAXDOPおよびONLINEオプションを使用できます。

    :MAXDOPおよびONLINEオプションを使用して、クラスター化されたインデックスのみを削除できます。

    構文は次のとおりです。

    DROP Index [indexName] on [schemaname].[tablename] with (MAXDOP = @maxdop_val, ONLINE = @online_option)
    • インデックス名: ドロップするインデックス名を指定します。
    • [SchemaName]。[TableName]: テーブルの3つの部分からなる名前を指定します。
    • @MaxDop_val: MAXDOPパラメーターの値を指定します。
    • @online_option: 有効な値はONとOFFです。

    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ステートメントは、任意のデータベースからテーブルを削除します。 DROPTABLEの構文は次のとおりです。

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

    [DatabaseName]。[SchemaName]。[TableName]: テーブル名を指定します。テーブルの3つの部分からなる名前を使用できます。

    許可

    ユーザーはALTERを持っている必要があります テーブルが作成されたスキーマとコントロールに対する権限 テーブルの権限、または 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 databaseステートメントは、データベース全体をドロップするように機能します。構文は次のとおりです。

    Drop database [DatabaseName]

    [データベース名] :削除するデータベース名を指定してください。

    許可

    データベースを削除するには、 CONTROLが必要です。 またはその他のデータベース データベースに対する権限。または、 db_ownerのメンバーである必要があります 固定データベースの役割。

    メモ

    1. データベースをオンラインにドロップしたとき 状態では、SQLServerはデータベースファイルをディスクから削除します。ただし、データベースをオフラインにドロップする場合 状態では、SQLServerはデータベースファイルを削除しません。手動で削除する必要があります。
    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に設定します モードに設定し、データベースに接続しているすべてのユーザーを削除します。

    それでは、DROPDATABASEステートメントを実行してみましょう。

    USE master 
    go 
    DROP DATABASE [EltechEmployees] 
    

    出力

    ご覧のとおり、コマンドは正常に実行されました。

    概要

    したがって、SQLDROPステートメントの特定のバリアントであるDROPINDEX、DROP TABLE、およびDROPDATABASEステートメントを調べました。この記事で紹介する実際の例が、これらのコマンドをいつどのように適用するかを説明するのに役立つことを願っています。


    1. プリペアドステートメントを使用したMySQLのLIMITキーワード

    2. Ubuntu 20.04 / 18.04/16.04にpgAdmin4をインストールする方法

    3. OracleデータベースでPL/SQLパッケージを作成する方法

    4. LaravelEloquentはmaxcreated_atですべての行を選択します