SQLでは、データベースからテーブルを削除する場合は、 DROP TABLE
を使用する必要があります。 ステートメント。
これにより、テーブルとそのすべてのデータが破壊されます。
構文
SQL標準構文は次のようになります:
DROP TABLE <table name> <drop behavior>
場所:
<テーブル名>
ドロップするテーブルの名前です。<ドロップ動作>コード> オプションを指定します。これらは
CASCADE
のいずれかです。 またはRESTRICT
。
一部のRDBMSは、オプションの IF EXISTS
も受け入れます。 テーブルが存在しない場合でもエラーを返さないことを意味する引数。
一部のRDBMS(MySQLやMariaDBなど)もオプションの TEMPORARY
を受け入れます 一時テーブルのみが削除されるようにするキーワード。
OracleはPURGE
も受け入れます ごみ箱からそれを削除する句。
例
実例を示します。
DROP TABLE t1;
そのコードを実行すると、 t1
というテーブルが削除されます とそのすべてのデータ。
IF EXISTS
条項
IF EXISTS
の使用例を次に示します。 テーブルがすでに存在するかどうかを確認する句。
DROP TABLE IF EXISTS t1;
IF EXISTS
の使用 テーブルが存在しない場合でもエラーが発生しないようにします。
IF EXISTS
を削除するとどうなりますか ステートメントから:
DROP TABLE t1;
結果:
Msg 3701, Level 11, State 5, Line 1 Cannot drop the table 't1', because it does not exist or you do not have permission.
これは、SQLServerによって返されるメッセージです。メッセージは、使用しているDBMSによって異なります。
依存する外部キーとビュー
一部のRDBMSでは、オプションの RESTRICT
が許可されています またはCASCADE
テーブルにそれを参照する外部キーまたはビューがある場合に何が起こるかを指定するキーワード。
RESTRICT
オプション
RESTRICT
の使用例を次に示します。 外部キーによって参照されているテーブルを別のテーブルにドロップしようとした場合:
DROP TABLE t1 RESTRICT;
結果:
cannot drop table t1 because other objects depend on it
この例はPostgreSQLを使用して行われました。 RESTRICT
はデフォルトのオプションであるため、 RESTRICT
を含めなくても、同じ結果が得られます。 キーワード。
CASCADE
オプション
CASCADE
に切り替えるとどうなりますか 同じテーブル(別のテーブルの外部キーによって参照されている)を削除しようとした場合:
DROP TABLE t1 CASCADE;
結果:
NOTICE: drop cascades to constraint t2_c2_fkey on table t2 Commands completed successfully
これにより、 t1
を参照していた外部キーが削除されました テーブル。外部キーはt2_c2_fkey
と呼ばれていました 。
外部キーを持つテーブルは削除されなかったことに注意してください。外部キーをドロップしただけです。
ターゲットテーブルの場合( t1
)任意のビューによって参照されていた場合、ビュー全体が削除されます。
CASCADE
を指定する必要はありません ターゲットテーブルに存在するインデックス、ルール、トリガー、または制約を削除します。デフォルトのオプション( RESTRICT
を使用している場合でも、これらは自動的に削除されます 。
MySQLとMariaDB
一部のDBMS(MySQLやMariaDBなど)は RESTRICT
を受け入れます およびCASCADE
キーワードですが、何もしません。これらは、DBMS間の移植を容易にするために提供されています。
Oracle
Oracleの構文は少し異なります。CASCADECONSTRAINTS
、これは、削除されたテーブルの主キーと一意キーを参照するすべての参照整合性制約を削除します。
SQL Server
SQLServerはCASCADE
をサポートしていません またはRESTRICT
キーワード。テーブルに外部キーの依存関係がある場合は、テーブルを削除する前にそれらを削除する必要があります。そうしないと、エラーが発生します。
ただし、SQL Serverでは、ビューまたはストアドプロシージャによって参照されている場合でも、テーブルを削除できます。したがって、そのような参照を確認し、 DROP VIEW
を使用して明示的に削除する必要があります。 またはDROPPROCEDURE
。
SQLite
SQLiteはCASCADE
をサポートしていません またはRESTRICT
キーワード。
ターゲットテーブルがいずれかのビューによって参照されている場合、テーブルは引き続き削除されます(ビューは残ります)。
ターゲットテーブルが外部キーによって参照されている場合、結果は、外部キーが有効になっているかどうか、有効になっている場合は子テーブルにデータがあるかどうか、有効になっている場合は外部キーが<で定義されているかどうかによって異なります。 code> ON DELETE CASCADE 。
SQLiteを使用する場合は、SQLite DROP TABLE
を参照してください。 外部キーによって参照されるテーブルを削除する例と説明については、
複数のテーブルを削除する
一部のRDBMSでは、単一の DROP TABLE
から複数のテーブルを削除できます。 ステートメント。
例:
DROP TABLE t11, t12;
この構文をサポートするRDBMSには、SQL Server、MySQL、MariaDB、およびPostgreSQLが含まれます。
ただし、外部キーによって参照されているテーブルを削除し、その外部キーによってそのテーブルが削除されない場合は、親テーブルの前に子テーブルをリストする必要があります。
たとえば、SQL Serverで上記のステートメントを実行すると、次のエラーが発生します。
Msg 3726, Level 16, State 1, Line 1 Could not drop object 't11' because it is referenced by a FOREIGN KEY constraint.
この場合、 DROP TABLE
のテーブルの順序を簡単に切り替えることができます。 ステートメント:
DROP TABLE t12, t11;
実際、この場合、 t12
という別のエラーが発生しました。 存在しません。
これが私が得たものです:
Msg 3701, Level 11, State 5, Line 1 Cannot drop the table 't12', because it does not exist or you do not have permission.
これは、前のステートメントで t11
を削除できなかったためです。 、実際には t12
の削除に成功しました 。
そして、エラーのコメディのように、今回は t11
をドロップすることができました ただし、 t12
ではありません 。
とにかく、両方のテーブルが削除されました。
ただし、最初に正しい注文を受け取った場合は、次のようなメッセージが表示されます。
Commands completed successfully.
TEMPORARYキーワード
一部のRDBMS(MySQLやMariaDBなど)は TEMPORARY
を受け入れます キーワード。
DROP
の間を行き来します およびTABLE
、このように:
DROP TEMPORARY TABLE t1;
TEMPORARY
の使用 キーワードを使用すると、一時テーブルを削除しようとしたときに、一時テーブル以外のテーブルを誤って削除しないようにできます。
TEMPORARY
キーワードには次の効果があります:
- ステートメントは
TEMPORARY
のみを削除します テーブル。 - ステートメントは暗黙的なコミットを引き起こしません(
DROP TABLE
を使用)TEMPORARY
なし キーワードは、現在アクティブなトランザクションを自動的にコミットします。 - アクセス権はチェックされません。
TEMPORARY
テーブルはそれを作成したセッションでのみ表示されるため、チェックは必要ありません。
パージ条項
OracleにはオプションのPURGE
があります これは、テーブルを削除して、それに関連付けられているスペースを1つのステップで解放する場合に使用できます。 PURGE
を指定した場合 の場合、データベースはテーブルとその依存オブジェクトをごみ箱に入れません。
これは、最初にテーブルを削除してからごみ箱から削除するのと同じですが、プロセスの1つのステップを節約できます。
PURGE
を指定する場合は注意してください 、テーブルを復元することはできません。
PURGE
を指定しない場合 、 DROP
TABLE
ステートメントによって、他のオブジェクトが使用するためにスペースが表領域に解放されることはなく、スペースは引き続きユーザーのスペース割り当てにカウントされます。