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

SQLServerでのDROPTABLEステートメントについて

    SQL ServerのDROPTABLEステートメントは、データベースからテーブルを削除するのに役立ちます。この記事では、いくつかの使用シナリオを説明し、DROPTABLEステートメントの動作を例で説明します。

    デモンストレーションには、 wideworldimportorsを使用しています。 デモデータベース–ここからダウンロードできます。

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

    Drop table [Database_name].[Schema_name].[table_name]
    • Database_name SQLでテーブルを削除するデータベースの名前。
    • Schema_Name テーブルが存在するスキーマの名前。 DBOスキーマでテーブルを作成した場合は、このパラメーターをスキップできます。テーブルがデフォルト以外のスキーマで作成されている場合は、スキーマ名の名前を指定する必要があります。
    • Table_Name 削除するSQLまたはMySQLのテーブルの名前。

    テーブルを削除すると、SQLServerは次のアクションを実行します。

    1. データを含むテーブルを削除します。
    2. テーブルの統計を削除します。
    3. そのテーブルに関連付けられているインデックス、制約、および主キーを削除します。外部キー関係がある場合は、子テーブルを削除する必要があります。

    テーブルを落とす前に、次のことに注意する必要があります。

    1. そのテーブルに依存するストアドプロシージャ、トリガー、およびビューが変更または変更されていることを確認します。 sp_depends を使用して、必要なデータベースオブジェクトを見つけることができます。 ストアドプロシージャ。
    2. 常に[database_name]。[schema_name]。[table_name]を使用します 正しいテーブルを削除するためのフォーマット。
    3. SQLServerバックアップから特定のテーブルを回復することは不可能であることに注意してください。特定のテーブルを回復する場合は、サードパーティのツールを購入する必要があります。テーブルに参照またはカスタムレポートが必要になる可能性があると思われる場合は、別のコピーを作成してテーブルのバックアップを生成してください。

    デモのセットアップ

    デモではWideworldimportors データベースには、 tblBusinessEntityという名前のテーブルがあります tblCountryRegion、 tblCity、 およびtblCustomer

    • テーブルtblBusinessEntity およびtblCustomer tblCountryRegion がデフォルトのスキーマにある間、 およびtblCity にいる スキーマ。
    • tblCity はシステムバージョンの時間テーブルです。
    • 外部キー制約はtblBusinessEntityの間にあります およびtblCustomer テーブル。 BusinessEntityID tblCustomerの列 BusinessEntityIDへの参照 tblBusinessEntity の列(主キー) テーブル。

    AdventureWorks2017のデータを挿入しました INSERT INTO SELECT*FROMステートメントを使用したデータベース。

    デモセットアップを準備するためのT-SQLスクリプトは次のとおりです。

    Use WideworldImportors
    go
    CREATE SCHEMA [country]
    Go
    

    テーブルを作成します:

    Use WideworldImportors
    go
    CREATE TABLE [tblBusinessEntity](
    	[BusinessEntityID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
    	[ModifiedDate] [datetime] NOT NULL,
     CONSTRAINT [PK_BusinessEntity_BusinessEntityID] PRIMARY KEY CLUSTERED 
    ([BusinessEntityID] ASC))
    GO
    
    CREATE TABLE [Country].[tblCountryRegion](
    	[CountryRegionCode] [nvarchar](3) NOT NULL,
    	[Name] varchar(500) NOT NULL
     CONSTRAINT [Country].[PK_CountryRegion_CountryRegionCode] PRIMARY KEY CLUSTERED 
    ([CountryRegionCode] ASC))
    GO
    CREATE TABLE [tblCustomer](
    	[BusinessEntityID] [int] NOT NULL,
    	[PersonType] [nchar](2) NOT NULL,
    	[NameStyle] varchar(15) NOT NULL,
    	[Title] [nvarchar](8) NULL,
    	[FirstName] varchar(150) NOT NULL,
    	[MiddleName] varchar(150) NULL,
    	[LastName] varchar(150) NOT NULL,
    	[Suffix] [nvarchar](10) NULL,
    	[EmailPromotion] [int] NOT NULL,
    	[ModifiedDate] [datetime] NOT NULL,
     CONSTRAINT [PK_Person_BusinessEntityID] PRIMARY KEY CLUSTERED 
    ([BusinessEntityID] ASC))
    GO
    CREATE TABLE [Country].[tblCity](
    	[CityID] [int] NOT NULL,
    	[CityName] [nvarchar](50) NOT NULL,
    	[StateProvinceID] [int] NOT NULL,
    	[LatestRecordedPopulation] [bigint] NULL,
    	[LastEditedBy] [int] NOT NULL,
    	[ValidFrom] [datetime2](7) GENERATED ALWAYS AS ROW START NOT NULL,
    	[ValidTo] [datetime2](7) GENERATED ALWAYS AS ROW END NOT NULL,
     CONSTRAINT [PK_Country_Cities] PRIMARY KEY CLUSTERED 
    (
    	[CityID] ASC
    ),
    	PERIOD FOR SYSTEM_TIME ([ValidFrom], [ValidTo])
    ) ON [USERDATA] TEXTIMAGE_ON [USERDATA]
    WITH
    (
    SYSTEM_VERSIONING = ON ( HISTORY_TABLE = [Country].[City_Archive] )
    )
    GO
    

    外部キーインデックスを作成します:

    Use WideworldImportors
    go
    ALTER TABLE [tblCustomer]  WITH CHECK ADD  CONSTRAINT [FK_Person_BusinessEntity_BusinessEntityID] FOREIGN KEY([BusinessEntityID])
    REFERENCES [tblBusinessEntity] ([BusinessEntityID])
    GO
    

    データをテーブルに挿入します:

    Use WideworldImportors
    Go
    set identity_insert tblBusinessEntity on
    Go
    insert into tblBusinessEntity ([BusinessEntityID],[ModifiedDate])
    select [BusinessEntityID],[ModifiedDate] from [AdventureWorks2017].[Person].[BusinessEntity]
    Go
    set identity_insert tblBusinessEntity off
    Go
    insert into tblCustomer ([BusinessEntityID],[PersonType],[NameStyle],[Title],[FirstName],[MiddleName],[LastName],[Suffix],[EmailPromotion],[ModifiedDate])
    select [BusinessEntityID],[PersonType],[NameStyle],[Title],[FirstName],[MiddleName],[LastName],[Suffix],[EmailPromotion],[ModifiedDate] 
    from AdventureWorks2017.Person.Person
    Go
    insert into [Country].[tblCountryRegion]([CountryRegionCode],[Name]) 
    select  [CountryRegionCode],[Name] from [AdventureWorks2017].[Person].[CountryRegion]
    Go
    

    スクリプトが実行されると、オブジェクトが正しく作成されているかどうか、およびデータがテーブルに挿入されているかどうかを確認できます。

    表を確認してください:

    Use WideWorldImporters
    Go
    select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME in ('tblCustomer','tblCountryRegion','tblBusinessEntity')
    Go
    

    出力:

    テーブルの行数を取得します:

    Use WideWorldImporters
    Go
    select object_name(object_id) as [Table Name], rows [Total Rows] from sys.partitions 
    where object_id in (object_id('tblCustomer'),object_id('country.tblCountryRegion'),object_id('tblBusinessEntity'))
    Go
    

    出力:

    それでは、例を挙げてDROPTABLEの使用法を見てみましょう。

    例1:DROPTABLEステートメントの簡単な適用

    テーブルでの作業中に、間違いが発生する場合があります。これは、ユーザーが存在しないテーブルを削除しようとしたときに発生します。これを回避する簡単な方法があります– SQL DROP TABLEIFEXISTSコマンドを使用します。

    構文は次のとおりです。

    -- use database
    USE [MyDatabase];
    GO
    
    -- attempt to run DROP TABLE only if it exists 
    DROP TABLE IF EXISTS [dbo].[MyTable0];
    GO

    SQLのDROPTABLEIF EXITSコマンドが自動的に実行するため、削除するテーブルがすでに存在するかどうかを手動で確認する必要はありません。

    すべてのテーブルを削除する必要がある場合は、SQL Server Management Studio(SSMS)を使用できます。

    tblCountryRegionを削除するとします。 私たちのデータベースからのテーブル。そのためには、次のクエリを実行します。

    use WideWorldImporters
    Go
    drop table tblCountryRegion
    

    エラーが発生しました:

    Msg 3701, Level 11, State 5, Line 3
    Cannot drop the table 'tblCountryRegion' because it does not exist 
    or you do not have permission.
    

    前述のように、デフォルト以外のスキーマで作成されたテーブルを削除するには、[schema_name]。[table_name]にDROPTABLEステートメントを記述する必要があります。 フォーマット

    次のクエリを実行します:

    use WideWorldImporters
    Go
    drop table [country].[tblCountryRegion]
    

    出力:

    Commands completed successfully.

    テーブルを正常に削除しました。

    例2:外部キーを持つテーブルを削除する

    tblBusinessEntityを削除しましょう データベースから–次のクエリを実行します:

    use WideWorldImporters
    Go
    Drop table tblBusinessEntity
    

    エラーを返します:

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

    親テーブルの主キーを参照する外部キーを使用してテーブルを削除する場合は、親テーブルを削除する必要があります。そうすれば、子テーブルを削除できます。

    この場合、 tblBusinessEntityを削除します テーブルの場合、 tblCustomerを削除する必要があります テーブル。次のクエリを実行します:

    use WideWorldImporters
    Go
    Drop table tblcustomer
    

    したがって、テーブルは正常に削除されました。

    tblcustomerを削除した後 、次のステートメントを実行して、 tblBusinessEntityを削除します テーブル:

    use WideWorldImporters
    Go
    Drop table tblBusinessEntity
    

    出力:

    テーブルは正常に削除されました。

    例3:一時テーブルを削除する

    システムバージョンの一時テーブルは、SQL Server 2016で最初に登場しました。履歴テーブルは一時テーブルで発生した変更を追跡するため、これらのテーブルは削除および更新されたデータを取得できます。テンポラルテーブルの概念の詳細については、システムバージョンのテンポラルテーブルの概要を参照してください。

    一時テーブルの削除は、通常のテーブルの削除プロセスとは異なります。次の手順を実行する必要があります。

    1. SYSTEM_VERSIONINGをオフにします。
    2. テンポラルテーブルを削除します。
    3. 履歴テーブルを削除します。

    プロセスを調べてみましょう– [国]。[都市]を削除します テーブル。

    手順1:次のスクリプトを実行して、SYSTEM_VERSIONINGをオフにします。

    Alter table [Country].[tblCity] set ( SYSTEM_VERSIONING = OFF  )

    ステップ2:[国]。[都市]を削除します 次のDROPTABLEステートメントを実行してテーブルを作成します。

    drop table [Country].[tblCity]

    ステップ3:[国]。[City_Archive]を削除します 次のクエリを実行してテーブルを作成します:

    drop table [Country].[City_Archive]

    手順4:次のクエリを実行して、テーブルが削除されたことを確認します。

    Use WideWorldImporters
    Go
    select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME in ('tblCity')
    

    出力:

    ご覧のとおり、テーブルは削除されました。

    概要

    DROP TABLEステートメントは、データベースから特定のテーブルを完全に削除する必要がある場合に必要です。ただし、このステートメントの使用法にはその特徴があります。いくつかの標準的な使用例と、タスク中に発生する可能性のある問題について説明しました。

    また、DROP TABLEステートメントを適用して、単一のテーブル、外部キーを持つテーブル、およびシステムバージョンの一時テーブルを削除する方法も学習しました。この記事がお役に立てば幸いです。

    また読む

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


    1. 悪名高いjava.sql.SQLException:適切なドライバーが見つかりません

    2. OracleDate-現在までの年数を追加する方法

    3. Oracleのコンマ区切り値

    4. PostgreSQL全文検索とトリグラムの混乱