【ORACLE】テーブルを作成・変更・削除するSQL


ここではORACLEデータベースで、テーブルを作成・変更・削除するSQLを紹介しています。

テーブルの一覧やサイズを確認する方法は↓で紹介しています。
>>【ORACLE】テーブルの一覧やサイズを確認するSQL

テーブルとは

テーブルとは、データベースでデータを格納しているオブジェクトです。

テーブルは行(ROW)と列(COLUMN)からなる表形式でデータを保持します。

保存したデータはSQLを使って中身を確認したり、更新や削除、新しいデータを登録することが出来ます。

データは1件を1行や1レコードと言ったりします。

テーブルを作成するSQL

テーブルの作成はCREATE TABLE文を使います。

テーブルの名前は最大30バイトです。

テーブルの作成や変更、削除には↓の権限が必要です。
 作成:CREATE TABLE、CREATE ANY TABLE
 変更:ALTER ANY TABLE
 削除:DROP ANY TABLE

システム権限の付与の方法については↓で紹介していますので参考にしてください。
>>【ORACLE】システム権限を付与・取消するSQL

CREATE TABLE文の基本構文

CREATE TABLE文の基本構文は次の通りです。

CREATE TABLE テーブル名(
    列名 データの型 [列の制約]
    [,列名 データの型 [列の制約]]
)
[TABLESPACE 表領域名]
;

[TABLESPACE 表領域名]でテーブルを作成する表領域を指定します。指定しない場合はデフォルト表領域になります。

CREATE TABLE文を使ったSQLサンプル

CREATE TABLE文のサンプルです。

次のSQLでは、TAB1というCOL1~3のカラムを持ったテーブルをTBS1という表領域に作成しました。

CREATE TABLE tab1(
    col1 varchar(10)
    ,col2 NUMBER
    ,col3 TIMESTAMP
)
TABLESPACE tbs1
;

CREATE TABLE文で指定できるその他のパラメータ

CREATE TABLE文ではTABLESPACEの他にも指定できるパラメータがあります。

主なパラメータは次の通りです。

CREATE TABLE テーブル名(
    列名 データの型 [列の制約]
    [,列名 データの型 [列の制約]]
)
[TABLESPACE 表領域名]
[PCTFREE ブロックの空き領域の割合]
[PCTUSED ブロックの使用領域割合]
[STRAGE
 (
  [INITIAL サイズ]
  [NEXT サイズ]
  [MINEXTENTS エクステント数]
  [MAXEXTENTS エクステント数 | UNLIMITED]
  [PCTINCREASE エクステントサイズ拡大率]
 )
]
;

・[PCTFREE ブロックの空き領域の割合]
 ブロックに対する空き領域の割合を指定します。デフォルトは10です。

・[PCTUSED ブロックの使用領域割合]
 ブロックの使用する領域の割合を指定します。デフォルトは40です。

・[INITIAL サイズ]
 初期エクステントのサイズをバイト単位(KまたはM)で指定します。

・[NEXT サイズ]
 初期エクステントが不足したときに追加するサイズをバイト単位(KまたはM)で指定します。

・[MINEXTENTS 最小エクステント数]
 オブジェクト作成時の最小エクステント数を指定します。

・[MAXEXTENTS エクステント数 | UNLIMITED]
 エクステントの最大数を指定します。UNLIMITEDの場合は無制限になります。

・[PCTINCREASE エクステントサイズ拡大率]
 エクステントを増加する割合を指定します。デフォルトは50です。

別スキーマのテーブルの参照

別スキーマの表を参照するには、事前にシステム権限のSELECT ANY TABLE権限を付与する必要があります。

SELECT ANY TABLE権限はGRANT文で付与します。

次のSQLではGRANT文を使って、user1にSELECT ANY TABLE権限を付与しています。

GRANT SELECT ANY TABLE TO user1;

システム権限の付与や取消については↓で詳しく解説していますので参考にしてください。
>>【ORACLE】システム権限を付与・取消するSQL

別スキーマのテーブルを参照するときは、テーブル名をFROM句で指定するとき「スキーマ名.テーブル名」とします。

次のSQLでは、user2スキーマのtab1テーブルを参照しています。

SELECT * FROM user2.tab1

テーブルをコピーして別のテーブルを作成する

あるテーブルをコピーし、別のテーブルを作成するにはCREATE ~ AS SELECT文を使います。

この方法を使うことで、SELECT結果から簡易的にバックアップテーブルを作成することが出来ます。

CREATE ~ AS SELECT文の基本構文は次の通りです。

CREATE TABLE テーブル名
AS SELECT 列名 FROM コピー元テーブル名;

次のSQLでは、TAB1テーブルの列名、データ型、データをTAB2テーブルとしてコピーしています。

CREATE TABLE tab2
AS SELECT * FROM tab1;

テーブルの定義は同じでレコードをコピーしたくない場合は、WHERE句で条件を指定してレコード件数が0になるようにするとテーブル定義だけコピーすることが出来ます。

CREATE TABLE tab2
AS SELECT * FROM tab1 WHERE 0=1;

テーブルの定義情報(DDL文)を取得してコピーすることもできます。

テーブルのDDL文(CREATE文)は、DBMS_METADATAパッケージのGET_DDLファンクションを使うことで取得することが出来ます。

DBMS_METADATAについては↓で紹介していますので参考にしてください。
>>テーブルの定義、列名一覧、名前(コメント)、DDLの確認方法

テーブルを変更するSQL

ALTER文を使うことで、テーブルを変更することが出来ます。

テーブル名を変更するSQL

ALTER TABLE tab1 RENAME TO tab2;

テーブルの表領域を変更するSQL

ALTER TABLE tab1 MOVE TABLESPACE tbs2;

テーブルを読取専用に変更するSQL

ALTER TABLE tab1 READ ONLY;

テーブルを削除するSQL

DROP:テーブル定義とデータ全ての削除

表・テーブルの定義と全てのレコードを削除するときは、DROP文を使います。

DELETEやTRUNCATEと違い、テーブルそのものを定義ごと削除します。十分に注意して使ってください。

基本構文は次の通りです。

DROP TABLE テーブル名;

外部キー制約を同時に削除する場合は「CASCADE CONTRAINTS」を指定します。

DROP TABLE tab1 CASCADE CONTRAINTS;

DELETE:表のデータを削除

表・テーブルのレコードを削除するには、DELETE文を使います。

DELETE文の基本構文は次の通りです。WHERE句の条件は任意でつけることが可能です。

DELETE FROM テーブル名 [WHERE 条件];

削除する対象のレコードを絞りたい場合はWHERE句に条件を指定します。次のSQLでは、COL1列の値が’00001’のレコードだけを削除しています。

DELETE FROM tab1 WHERE col1 = '00001';

TRUNCATE文:表のレコードを全件削除する

表・テーブルのレコードを全件削除するときは、DELETE文のほかに、TRUNCATE文が使えます。

TRUNCATE文は、DELETE文と違い、「1.一括削除しかできない」「2.ロールバックできない」「3.DELETE文よりも処理時間が速い」という特長があります。

特にロールバック出来ないので、実行する際は注意してください。

TRUNCATE文の基本構文は次の通りです。

TRUNCATE TABLE テーブル名;

DROPで削除したテーブルの復活

ドロップした表は、削除した直後はゴミ箱にあります。ゴミ箱から元の場所に戻すことで表を復活させることが出来ます。

削除したテーブルの名前を確認し、復活するSQLを実行します。

削除したテーブルはDBA_RECYCLEBINで参照することが出来ます。

SELECT * FROM DBA_RECYCLEBIN WHERE TYPE = 'TABLE';

削除したテーブルはFLASHBACK TABLEで復活することが出来ます。

FLASHBACK TABLE テーブル名 TO BEFORE DROP;

まとめ

テーブルの作成はCREATE TABLE、変更はALTER文、削除はDROP文を使います。

テーブルの作成や変更、削除には↓の権限が必要です。
 作成:CREATE TABLE、CREATE ANY TABLE
 変更:ALTER ANY TABLE
 削除:DROP ANY TABLE

システム権限の付与の方法については↓で紹介していますので参考にしてください。
>>【ORACLE】システム権限を付与・取消するSQL