DROP TABLE
データベースからテーブルを削除します。
テーブルを削除せずに、テーブルの行を空にする場合、DELETE または TRUNCATE コマンドを使用します。
DROP TABLE を使用すると、ターゲットテーブルに存在する制約が削除されます。1 つの DROP TABLE コマンドで複数のテーブルを削除できます。
DROP TABLE と外部テーブルは、トランザクション内 (BEGIN … END) で実行することはできません。トランザクションの詳細については、「直列化可能分離」を参照してください。
DROP 権限がグループに付与される例を見つけるには、「GRANT 例」を参照してください。
必要な権限
DROP TABLE に必要な権限を以下に示します。
スーパーユーザー
DROP TABLE の権限を持つユーザー
スキーマに対する USAGE 権限を持つテーブル所有者
構文
DROP TABLE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]
パラメータ
- IF EXISTS
-
指定されたテーブルが存在しない場合、コマンドはエラーで終了するのではなく、何も変更しないで、テーブルが存在しないというメッセージを返すことを示す句。
この句は、存在しないテーブルに対して DROP TABLE を実行してもスクリプトが失敗しないため、スクリプトを作成する際に便利です。
- name
-
削除するテーブルの名前。
- CASCADE
-
ビューなどのテーブルに依存するオブジェクトを自動的に削除することを示す句。
ビューやテーブルなど、他のデータベースオブジェクトに依存しないビューを作成するには、ビュー定義に WITH NO SCHEMA BINDING 句を含めます。詳細については、「CREATE VIEW」を参照してください。
- RESTRICT
-
テーブルに依存するオブジェクトがある場合、テーブルを削除しないことを示す句。この動作がデフォルトです。
例
依存するオブジェクトがないテーブルの削除
次の例では、依存するオブジェクトがない FEEDBACK というテーブルを作成して、削除します。
create table feedback(a int); drop table feedback;
ビューまたは他のテーブルによって参照される列がテーブルに含まれている場合は、次のようなメッセージが Amazon Redshift に表示されます。
Invalid operation: cannot drop table feedback because other objects depend on it
2 つのテーブルの同時削除
次のコマンドセットでは、FEEDBACK テーブルと BUYERS テーブルを作成し、1 つのコマンドで両方のテーブルを削除します。
create table feedback(a int); create table buyers(a int); drop table feedback, buyers;
依存関係を持つテーブルの削除
次の手順では、CASCADE スイッチを使用して、FEEDBACK というテーブルを削除する方法について説明します。
まず、CREATE TABLE コマンドを使用して、FEEDBACK という単純なテーブルを作成します。
create table feedback(a int);
次に、CREATE VIEW コマンドを使用して、テーブル FEEDBACK に依存する FEEDBACK_VIEW というビューを作成します。
create view feedback_view as select * from feedback;
次の例では、テーブル FEEDBACK を削除し、ビュー FEEDBACK_VIEW も削除します。これは、FEEDBACK_VIEW がテーブル FEEDBACK に依存しているためです。
drop table feedback cascade;
テーブルの依存関係の表示
テーブルの依存関係を返すには、次の例を使用します。my_schema
と my_table
を独自のスキーマとテーブルに置き換えます。
SELECT dependent_ns.nspname as dependent_schema , dependent_view.relname as dependent_view , source_ns.nspname as source_schema , source_table.relname as source_table , pg_attribute.attname as column_name FROM pg_depend JOIN pg_rewrite ON pg_depend.objid = pg_rewrite.oid JOIN pg_class as dependent_view ON pg_rewrite.ev_class = dependent_view.oid JOIN pg_class as source_table ON pg_depend.refobjid = source_table.oid JOIN pg_attribute ON pg_depend.refobjid = pg_attribute.attrelid AND pg_depend.refobjsubid = pg_attribute.attnum JOIN pg_namespace dependent_ns ON dependent_ns.oid = dependent_view.relnamespace JOIN pg_namespace source_ns ON source_ns.oid = source_table.relnamespace WHERE source_ns.nspname = 'my_schema' AND source_table.relname = 'my_table' AND pg_attribute.attnum > 0 ORDER BY 1,2 LIMIT 10;
my_table
とその依存関係を削除するには、次の例を使用します。この例では、削除されたテーブルのすべての依存関係も返されます。
DROP TABLE my_table CASCADE; SELECT dependent_ns.nspname as dependent_schema , dependent_view.relname as dependent_view , source_ns.nspname as source_schema , source_table.relname as source_table , pg_attribute.attname as column_name FROM pg_depend JOIN pg_rewrite ON pg_depend.objid = pg_rewrite.oid JOIN pg_class as dependent_view ON pg_rewrite.ev_class = dependent_view.oid JOIN pg_class as source_table ON pg_depend.refobjid = source_table.oid JOIN pg_attribute ON pg_depend.refobjid = pg_attribute.attrelid AND pg_depend.refobjsubid = pg_attribute.attnum JOIN pg_namespace dependent_ns ON dependent_ns.oid = dependent_view.relnamespace JOIN pg_namespace source_ns ON source_ns.oid = source_table.relnamespace WHERE source_ns.nspname = 'my_schema' AND source_table.relname = 'my_table' AND pg_attribute.attnum > 0 ORDER BY 1,2 LIMIT 10;
+------------------+----------------+---------------+--------------+-------------+ | dependent_schema | dependent_view | source_schema | source_table | column_name | +------------------+----------------+---------------+--------------+-------------+
IF EXISTS を使用したテーブルの削除
次の例では、FEEDBACK テーブルが存在する場合は削除し、存在しない場合は何もしないでメッセージを返します。
drop table if exists feedback;