【SQL】DROP TABLEの使い方|テーブル削除・IF EXISTS・DELETEとの違い
テーブルを構造ごと削除するSQLがDROP TABLEです。中の行だけを消したい場合は、DELETEやTRUNCATE TABLEを使います。
この記事ではSQL Serverを対象に、基本構文と使い分け、SSMSでの操作を短い実習で説明します。ほかのデータベース製品では、構文やトランザクションの扱いが異なります。
DROP TABLEの基本構文
DROP TABLE dbo.SampleProducts;dboはスキーマ名、SampleProductsはテーブル名です。この例を実行すると、テーブルのデータ・列定義・インデックス・制約・トリガーなどが削除されます。WHEREで行を絞り込むことはできません。
実行前に、接続先・データベース・スキーマ・テーブル名を確認しましょう。削除確認の画面が出るとは限りません。実習は、このあと作る練習用データベースだけで行います。
DELETE・TRUNCATE・DROPの違い
| 命令 | 削除するもの | テーブル構造 |
|---|---|---|
| DELETE | WHEREに一致する行。省略すると全行 | 残る |
| TRUNCATE TABLE | 全行(WHEREは使えない) | 残る |
| DROP TABLE | テーブルとそのデータ | 残らない |
「商品を1件消す」ならDELETE、「テーブルを残して全件空にする」ならTRUNCATE TABLEが候補です。TRUNCATEには外部キーなどの制限があるため、単に速いDELETEとして置き換えないようにします。
条件を指定して行を削除したい方は、DELETE文の書き方と削除前の確認手順を参考にしてください。
IF EXISTSで存在しない場合のエラーを避ける
DROP TABLE IF EXISTS dbo.SampleProducts;SQL Server 2016以降では、対象が存在するときだけ削除できます。すでに削除済みでも、「存在しないこと」によるエラーを避けられます。
IF EXISTSは誤削除を防ぐ機能ではありません。対象が存在すれば削除します。権限不足や外部キーの問題も、これだけでは解決しません。
SSMSでテーブルを削除する手順
WindowsでSQL Server LocalDBとSSMSを使う例です。接続先は(LocalDB)\MSSQLLocalDB。準備がまだの場合は、LocalDBへの接続とSSMSの基本操作を確認してください。C#.NETからの実行方法も同記事で扱っています。
SQLはコード欄ごとに順番に実行します。SSMSでは選択したSQLだけを実行でき、未選択ならクエリ全体が対象になります。「実行」またはF5を押す前に、選択範囲も確認してください。
1. 練習用データベースとテーブルを作る
新しいクエリで、まず次の1行だけを実行します。DropSampleDBがすでに存在してエラーになった場合は、そのまま先へ進まず、別の練習用名へ統一して変更してください。既存DBを削除して作り直す必要はありません。
CREATE DATABASE DropSampleDB;作成できたら、次を実行して接続中のデータベースを確認します。
USE DropSampleDB;
GO
SELECT DB_NAME() AS CurrentDatabase;CurrentDatabaseがDropSampleDBなら、次のSQLでサンプル商品3件を用意します。GOはSSMSなどが処理するバッチの区切りです。C#のコマンド文字列にそのまま含めるものではありません。
CREATE TABLE dbo.SampleProducts
(
ProductId INT PRIMARY KEY,
ProductName NVARCHAR(100) NOT NULL,
Price INT NOT NULL,
CreatedAt DATETIME NOT NULL
);
GO
INSERT INTO dbo.SampleProducts
(ProductId, ProductName, Price, CreatedAt)
VALUES
(1, N'ノートパソコン', 120000, GETDATE()),
(2, N'ワイヤレスマウス', 3500, GETDATE()),
(3, N'キーボード', 8000, GETDATE());
SELECT ProductId, ProductName, Price, CreatedAt
FROM dbo.SampleProducts;ProductIdが主キーです。商品名・価格・登録日時にはNOT NULLを指定しています。3件表示されれば、削除する前の準備はできています。
2. 対象を確かめてDROP TABLEを実行する
対象のデータベースを明示し、テーブル名を確認してから削除します。このコードは、練習用SampleProductsを実際に削除する例です。
USE DropSampleDB;
GO
DROP TABLE dbo.SampleProducts;| 確認するもの | 削除前 | DROP TABLE後 |
|---|---|---|
| dbo.SampleProducts | 存在する | 存在しない |
| 商品データ | 3件 | テーブルごと削除 |
| DropSampleDB | 存在する | 残る |
SQL Serverの通常の自動コミットモードでは、この文の成功で確定します。後からROLLBACKを実行しても取り消せません。
3. 削除されたことを確認する
SELECT TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'dbo'
AND TABLE_NAME = 'SampleProducts';同じ接続・データベースで実行し、結果が0件なら、今回作成したdbo.SampleProductsが一覧にないことを確認できます。一般にメタデータの表示範囲は権限にも依存するので、別ユーザーの0件結果だけで不存在と決めつけないようにします。
オブジェクトエクスプローラーに名前が残っている場合は、「テーブル」を右クリックして「最新の情報に更新」を選びます。削除後のテーブルにSELECTすると、存在しないためエラーになります。
削除できないときの確認表
| エラー・現象 | 先に確認すること |
|---|---|
| 存在しない、または権限がない | 接続先、DB、dboなどのスキーマ、テーブル名、実行ユーザーの権限 |
| FOREIGN KEYで参照されている | 参照元のテーブル・制約と、それを使う処理 |
| オブジェクト名が無効 | 削除後のテーブルをSELECTしていないか。DBやスキーマ違いも確認 |
| 一覧に名前が残る | オブジェクトエクスプローラーを更新 |
| 待機したまま終わらない | 別セッションの処理やロックを確認し、管理者に相談 |
外部キーや参照先の処理を確認する
別テーブルの外部キーが対象を参照していると、DROP TABLEはそのままでは実行できません。たとえばProductsがCategoriesを参照しているなら、Categoriesだけを先に削除できません。
関係ごと廃止する場合には、参照元の外部キー制約を先に削除する方法があります。ただし、エラーを消すためだけに制約を外すと、必要な整合性のチェックもなくなります。SSMSの「キー」で制約名を確認し、参照元データとアプリへの影響を判断してから変更してください。
テーブルを参照するビューやストアドプロシージャも確認します。DROP TABLEが成功しても、それらが自動的に使える形へ直るわけではありません。
権限は管理者と確認する
DROP TABLEには、対象スキーマのALTER、テーブルのCONTROL、またはdb_ddladminロールへの所属などの権限が必要です。権限エラーが出たら、名前の間違いと実行ユーザーを確認してから管理者へ相談します。
DROP TABLEはロールバックできる?
SQL Serverでは、明示的なトランザクション内で実行したDROP TABLEは、まだ確定していなければROLLBACKで取り消せます。自動コミットで成功したあとや、COMMITで確定したあとは取り消せません。
| 実行した状態 | 取り消しの考え方 |
|---|---|
| BEGIN TRANSACTIONのあと、まだCOMMITしていない | 同じトランザクションでROLLBACKできる。ほかの変更も戻る範囲に注意 |
| 自動コミットで完了/COMMIT済み | ROLLBACKでは戻せない。復元可能なバックアップなどを確認 |
| DROP DATABASE | 明示的なトランザクション内では実行できず、ROLLBACKで戻す前提にしない |
トランザクションを開いたまま放置すると、ほかの処理を待たせることがあります。本番や共有DBでは、依存関係と復元手段を事前に確認します。「取り消せるはず」をバックアップの代わりにはしません。
練習用データベースの後片付け
DropSampleDB全体が不要になった場合だけ、次を別のクエリとして実行します。テーブルだけを消したいときには不要です。
USE master;
GO
DROP DATABASE IF EXISTS DropSampleDB;DROP DATABASEはDB全体を削除します。今回自分で作った練習用DBで、ほかの必要なデータが入っていないことを確認してください。「現在使用中」なら、対象DBを使う自分の別接続などを確認します。共有接続を強制終了して進める必要はありません。
目的に合わせて削除方法を選ぼう
行だけならDELETE、全行を空にするならTRUNCATE TABLE、テーブル自体が不要ならDROP TABLEです。実行前に対象を確認し、IF EXISTSは「存在しない場合への対応」として使いましょう。
仕様の確認:DROP TABLE、TRUNCATE TABLE、トランザクション、ROLLBACK、DROP DATABASE、GO(Microsoft Learn)
サイトアイコン-2-150x150.png)