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 ステートメントによって、他のオブジェクトが使用するためにスペースが表領域に解放されることはなく、スペースは引き続きユーザーのスペース割り当てにカウントされます。