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

SQLDROPTABLEステートメントとさまざまなユースケース

    SQL DROP TABLEステートメントは、データベースからテーブルを削除するのに役立ちます。テーブルとそれに関連付けられているデータおよびインデックスを削除します。ステートメントは元に戻せません。したがって、バックアップを復元することによってのみテーブルを復元できます。

    この記事では、次のケースについて説明します。

    1. 1つまたは複数のテーブルを削除します。
    2. ビューで使用されているテーブルを削除します。
    3. 外部キーを持つテーブルを削除します。
    4. クラスター化インデックスと非クラスター化インデックスを持つテーブルを削除します。
    5. レプリケーション設定からテーブルを削除します。

    DROPTABLEステートメントの構文は次のとおりです。

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

    注:SQL Server 2016以降を使用している場合は、 IF EXISTSを指定できます。 ドロップテーブルの前 ステートメント。

    また、DROPTABLEステートメントの後にテーブル名を指定します。テーブル名の形式は、[データベース名]。[スキーマ名]。[テーブル名]。

    である必要があります。

    DROPTABLEステートメントの簡単な例

    デモンストレーションのために、 AdventureWorks2017を復元しました 私のワークステーション上のデータベース。ここでは、従業員を削除します テーブル。

    テーブルを削除するために使用される次のクエリを使用します。

    DROP TABLE [AdventureWorks2017].[dbo].[employees]

    SQL ServerManagementStudioにDevartdbForgeSQLCompleteツールをインストールしました。 SQL DROP TABLEステートメントを実行すると、次のような確認ダイアログボックスが表示されます。

    とにかく実行をクリックします 。テーブルが削除されます。

    確認するには、次のクエリを実行します:

    SELECT * FROM dbo. employee

    テーブルを正常に削除すると、次のエラーが発生します。

    Msg 208, Level 16, State 1, Line 1
    Invalid object name 'dbo.employee'.

    ビューで使用されているテーブルを削除します

    ここでは、データベースビューで使用されるテーブルを削除してみます。次のスクリプトを実行して、 vPersonという名前のビューを作成します

    CREATE VIEW vPerson 
    AS
    SELECT * FROM Person p
    

    DROP TABLEを実行します を削除するコマンド テーブル:

    DROP TABLE [AdventureWorks2017].[dbo].[person]

    テーブルが削除されたら、SELECTクエリを実行して、 vPersonからデータを入力します。 。エラーが発生します:

    Msg 208, Level 16, State 1, Procedure vPerson, Line 3 [Batch Start Line 0]
    Invalid object name 'Person'.
    Msg 4413, Level 16, State 1, Line 1
    Could not use the view or function 'vPerson' because of binding errors.
    

    このエラーは、ビューが依存しているオブジェクトがドロップされたときに発生します。

    外部キーを持つテーブルを削除します

    テーブルに外部キーを作成した場合、子テーブルを削除する前に親テーブルを削除することはできません。つまり、最初に子テーブルまたは子テーブルを参照する外部キーを削除する必要があります。

    tblstudentという名前のテーブルが2つあります およびtblSchool –ER図は次のとおりです。

    :使用しています dbForge Studio for SQL Server 2019 データベース図を作成する–すべての要素を含むテーブル構造と、テーブル間のエンティティ関係について適切な洞察を提供します。

    次のクエリは、 tblstudentという名前のテーブルを作成します およびtblSchool およびそれらの主キーと外部キー:

    CREATE TABLE tblSchool
    (
    	SchoolID INT identity(1,1),
    	SchoolName VARCHAR(500),
    	City varchar(250),
    	CONSTRAINT PK_SchoolID PRIMARY KEY  (SchoolID)  
    )
    GO
    CREATE TABLE tblStudent
    (
    StudentID INT IDENTITY(1,1) ,
    StudentName VARCHAR(250),
    StudentGrade CHAR(1),
    SchoolID INT,
    CONSTRAINT PK_StudentID PRIMARY KEY  (StudentID),
    Constraint FK_SchoolID FOREIGN KEY (SchoolID) REFERENCES tblSchool (SchoolID)
    )
    GO
    

    次のクエリを実行して、 tblstudentを削除します テーブル:

    Drop table [tblSchool]

    クエリは次のエラーを返します:

    Msg 3726, Level 16, State 1, Line 22
    Could not drop object 'tblSchool' because it is referenced by a FOREIGN KEY constraint.
    

    私たちのデモでは、 tblschoolを削除したい場合 テーブルの場合、 tblstudentを削除する必要があります 最初にテーブル。 tblStudentを削除するクエリをご覧ください およびtblschool テーブル:

    Drop table [tblSchool]
    Go
    Drop table [tblStudent]
    Go
    

    単一のDROPTABLEステートメントでバッチテーブルを削除することもできます。次のようにクエリを実行します。

    Drop table [tblSchool], [tblStudent]

    インデックス付きのテーブルを削除する

    DROPTABLEステートメントの動作の別のシナリオを観察してみましょう。 tblstudent。という名前のテーブルを作成したと仮定します。 クラスター化されたインデックスとクラスター化されていないインデックスがあります。

    DROP TABLEを使用してテーブルを削除すると、インデックスが削除されますか?確認してみましょう。 tblStudentという名前のテーブルを作成しました 1つのクラスター化されたインデックスと1つの非クラスター化されたインデックスがあります。クエリは次のとおりです。

    CREATE TABLE tblStudent
    (
    StudentID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
    StudentName VARCHAR(250),
    StudentGrade CHAR(1),
    SchoolID INT
    )
    GO
    CREATE NONCLUSTERED INDEX IDX_tblStudent_StudentName ON tblStudent(StudentName) 
    GO
    

    sys.indexes にクエリを実行すると、インデックスのリストを確認できます。 DMV。

    テーブルが削除されたら、次のクエリを実行します。

    SELECT Object_name(object_id) AS [Table Name],
           NAME                   AS [Index Name],
           type_desc              [Index Type]
    FROM   sys.indexes
    WHERE  object_id = Object_id('tblStudent')  
    

    出力:

    ご覧のとおり、 tblStudentのクラスター化インデックスと非クラスター化インデックスの両方を作成しました。 テーブル。

    次に、次のコマンドを実行してテーブルを削除します。

    Drop table tblStudent

    ここでも、インデックスのリストに入力するために使用したのと同じクエリを実行します。

    SELECT Object_name(object_id) AS [Table Name],
           NAME                   AS [Index Name],
           type_desc              [Index Type]
    FROM   sys.indexes
    WHERE  object_id = Object_id('tblStudent')  
    

    出力:

    上のスクリーンショットは、クエリが空の結果セットを返したことを示しています。したがって、テーブルを削除すると、そのテーブルに関連付けられているインデックスも削除されます。

    レプリケーションからテーブルを削除する

    レプリケーションの一部であるテーブルを削除するとします。この場合、追加の手順を実行する必要があります。

    SQL01とSQL02という名前のSQLServer2019の2つのインスタンス間のレプリケーションを構成しました。次に、 tblStudentを複製しました およびtblSchool テーブル。

    次のクエリを実行して、SQL01からtblSchoolテーブルを削除します。

    use codingsight
    go
    drop table tblSchool
    

    出力:

    Msg 3724, Level 16, State 3, Line 3
    Cannot drop the table 'tblSchool' because it is being used for replication.
    

    上記のエラーは説明的なものです。テーブルを削除するには、最初にテーブルをレプリケーションから削除する必要があります:

    1. SQL Server Management Studioを開き、SQL01に接続します。
    2. レプリケーションを拡張します ->ローカルパブリケーションを展開します
    3. [パブリケーション]を右クリックして、[プロパティ]を選択します 。

    パブリケーションプロパティ ウィンドウで、記事をクリックします

    そこに、テーブルのリストが表示されます。 tblSchoolのチェックを外します 表をクリックし、[ OK]をクリックします 。

    注: 記事をレプリケーションから削除すると、以前のスナップショットは無効になります。記事を削除した後、新しいスナップショットを生成する必要があります。

    テーブルがレプリケーションから削除されたら、 DROP TABLEを実行します SQL01のコマンド :

    use codingsight
    go
    drop table tblSchool
    

    出力:

    ご覧のとおり、テーブルは削除されています。


    1. JDBCを使用してOracleデータベースに接続するためのURL文字列形式

    2. PostgreSQL論理レプリケーションを使用して常に最新の読み取り/書き込みテストサーバーを維持する

    3. Prismaの使い方

    4. SQLvarchar列の長さのベストプラクティス