CREATE TABLE テーブルを作成するSQL文

CREATE TABLEとはテーブル(表)を作成するSQL文である。

SQL構文

CREATE TABLE [schema.]name (
  column_definition [,column_definition ...]
  [,out_of_line_constraint ...]
)
[TABLESPACE tablespace]
[PCTFREE 空き領域割合]
[PCTUSED 使用済領域割合]
[CACHE|NOCACHE]
[LOGGING|NOLOGGING]
[STORAGE([INITIAL initial-extent] [NEXT next-extent])]

一時表の作成

CREATE GLOBAL TEMPORARY TABLE [schema.]name (...) ON COMMIT {DELETE|PRESERVE} ROWS
schema

表を作成するスキーマの名前。 schema を省略した場合、自分のスキーマ内に表を作成する。自分のスキーマ以外に表を作成するには、 CREATE ANY TABLE システム権限が必要である。

name

作成するテーブルの名前を指定する。名前の付け方には次の規則がある。

column_definition

列の定義を指定する。

out_of_line_constraint

制約を指定する。

tablespace

表を作成する表領域の名前を指定する。表領域の指定を省略した場合、スキーマの所有者のデフォルトの表領域内に作成される。

PCTFREE

データベース・オブジェクトの各データ・ブロック内で、オブジェクトの行を将来更新するために確保しておく領域の割合を0から99までの整数で指定する。デフォルト値は10。

PCTUSED

使用済み領域のうち、データベース・オブジェクトのデータブロックごとに確保される最小限の割合を0から99までの整数で指定する。デフォルト値は40。

CACHE

バッファキャッシュ内のLRUリストの最高使用頻度側に置く。

NOCACHE

バッファキャッシュ内のLRUリストの最低使用頻度側に置く。

LOGGING

表のために必要な索引の作成をREDOログに作成する。

NOLOGGING

表のために必要な索引の作成をREDOログに作成しない。

STORAGE

Oracleデータベースによる永続的なデータベースオブジェクトの格納方法を指定する。

INITIAL

オブジェクトの第1エクステントのサイズを指定する。

NEXT

オブジェクトに割り当てる次のエクステントサイズを指定する。

GLOBAL TEMPORARY

一時表を作成する。 一時表 とは、トランザクション終了時又はセッション終了時に切り捨てられる表のことである。一時表のレコードは、作成したセッションからしか参照できない。また、REDOに記録されないので高速に処理される。

ON COMMIT DELETE ROWS

一時表はトランザクション内で有効となり、コミット後に切り捨てられる。

ON COMMIT PRESERVE ROWS

一時表はセッション内で有効となり、セッション終了時に切り捨てられる。

列の定義

列の定義は次の構文で指定する。

column type [DEFAULT value] [constraint ...]
column

列の名前を指定する。オラクルデータベースの場合、日本語で列の名前を指定することもできるが、他のRDBMSでは日本語を使えないことがある。そのため、移植性を考えるなら日本語の使用は避けた方がよい。

type

列のデータ型を指定する。

value

列のデフォルト値を指定する。

inline_constraint

列の制約を指定する。空白で区切って複数の制約を指定できる。

制約 説明
NOT NULL NULLにできない。INSERT文で行を挿入する際、列の値を指定するか、DEFAULT節で初期値が指定されている必要がある。
UNIQUE 値が一意で重複しない必要がある。ただし、NULLが複数あることは構わない。
PRIMARY KEY UNIQUE制約とNOT NULL制約が付く。また、索引が自動的に作成されます。
FOREIGN KEY FOREIGN KEY制約を付けた列は、親表名 によって識別される参照先の表の間で外部キー制約を指定します。
CHECK(condition) condition で指定した条件を満たす必要がある。条件を満たさない値をINSERT文で挿入しようとするとエラーとなり、行の挿入が失敗する。UPDATE文により値を更新しようとする際も同様である。

必要な権限

自分のスキーマに表を作成するには、CREATE TABLEシステム権限が必要である。

他のスキーマに表を作成するには、CREATE ANY TABLEシステム権限が必要である。

CREATE TABLEの例

CREATE TABLE文で表を作成する例を示す。

SQL> CREATE TABLE dept (deptno NUMBER(4), dname VARCHAR(80), loc VARCHAR(80) );

表が作成されました。

SQL>

表に主キー制約を設定する

主キー制約は次の構文で指定する。

[CONSTRAINT constraint] PRIMARY KEY (column [,column...])
constraint
制約の名前を指定する。制約名の指定を省略した場合、自動的に名前が付けられる。
column
主キー制約を付ける列の名前を指定する。

表の作成時に主キー制約を設定する例を以下に示す。

CREATE TABLE dept (
  deptno NUMBER(2),
  dname VARCHAR2(14),
  loc VARCHAR2(13),
  CONSTRAINT pk_dept PRIMARY KEY (deptno)
);

明示的に主キー制約の名前を指定せず、自動的に名前を付けさせる場合は次のようにする。

CREATE TABLE dept (
  deptno NUMBER(2) PRIMARY KEY,
  dname VARCHAR2(14),
  loc VARCHAR2(13)
);

列に外部キー参照制約を設定する

外部キー制約は次の構文で指定する。

[CONSTRAINT constraint] FOREIGN KEY (column [,column...]) REFERENCES table (column [,column...])
constraint
制約の名前を指定する。制約名の指定を省略した場合、自動的に名前が付けられる。
column
外部キー制約を付ける列の名前を指定する。
table
参照先のテーブル名を指定する。

テーブルに作成時に外部キー参照制約を設定する。

CREATE TABLE emp (
  empno NUMBER(4),
  ename VARCHAR2(10),
  job VARCHAR2(9),
  mgr NUMBER(4),
  hiredate DATE,
  sal NUMBER(7,2),
  comm NUMBER(7,2),
  deptno NUMBER(2),
  CONSTRAINT pk_emp PRIMARY KEY (empno),
  CONSTRAINT fk_deptno FOREIGN KEY (deptno) REFERENCES dept
);

関連SQL