本トピックでは、テーブルの作成方法について説明します。
構文
CREATE [ GLOBAL TEMPORARY ] TABLE table_name (
{ column_name data_type [ DEFAULT default_expr ]
[ column_constraint [ ... ] ] | table_constraint } [, ...]
)
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS } ]
[ TABLESPACE tablespace ]
column_constraint は次のいずれかの値です。
[ CONSTRAINT constraint_name ]
{ NOT NULL |
NULL |
UNIQUE [ USING INDEX TABLESPACE tablespace ] |
PRIMARY KEY [ USING INDEX TABLESPACE tablespace ] |
CHECK (expression) |
REFERENCES reftable [ ( refcolumn ) ]
[ ON DELETE action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED |
INITIALLY IMMEDIATE ]
また、table_constraint は次のいずれかの値です。
[ CONSTRAINT constraint_name ]
{ UNIQUE ( column_name [, ...] )
[ USING INDEX TABLESPACE tablespace ] |
PRIMARY KEY ( column_name [, ...] )
[ USING INDEX TABLESPACE tablespace ] |
CHECK ( expression ) |
FOREIGN KEY ( column_name [, ...] )
REFERENCES reftable [ ( refcolumn [, ...] ) ]
[ ON DELETE action ] }
[ DEFERRABLE | NOT DEFERRABLE ]
[ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
パラメーター
パラメーター | 説明 |
---|---|
GLOBAL TEMPORARY | このパラメーターを指定すると、テーブルは一時テーブルとして作成されます。 一時テーブルは、セッションの終わり、または現在のトランザクションの終わりに必要に応じて、自動的に削除されます。 詳細情報については、次のテーブルの ON COMMIT パラメーターをご参照ください。 スキーマ修飾名で参照されない限り、一時テーブルが存在している間は同じ名前を持つ既存のパーマネントテーブルを現在のセッションから見ることはできません。 また、一時テーブルは、それが作成されたセッションの外部から見ることができません。 グローバル一時テーブルのこのアスペクトは、Oracle データベースとは互換性がありません。 一時テーブルに作成されたインデックスも自動的に一時的なものになります。 |
table_name | 作成するテーブルの名前。
注 名前はスキーマで修飾できます。
|
column_name | 新しいテーブルに作成する列の名前。 |
data_type | 列のデータ型。 これには、配列指定子が含まれる場合があります。 |
DEFAULT default_expr | DEFAULT 句は、列定義が含まれる列にデフォルトデータ値を割り当てます。 値は、変数を含まない任意の式です。 現在のテーブルの他の列へのサブクエリと相互参照は許可されません。
デフォルトの式のデータ型は、列のデータ型と一致する必要があります。
デフォルトの式は、列の値を指定しない挿入操作で使用されます。 列にデフォルトデータ値がない場合、デフォルトは null です。 |
CONSTRAINT constraint_name | 列またはテーブル制約のオプションの名前。 指定しない場合、システムが名前を生成します。 |
NOT NULL | 列に null 値を含めることを許可しません。 |
PRIMARY KEY - column constraint |
主キー制約は、テーブルの 1 つまたは複数の列に一意で重複しない、null 以外の値を入力することを指定します。 技術的には、PRIMARY KEY は UNIQUE と NOT NULL を組み合わせたものにすぎません。 ただし、主キーとして列のセットを識別することでもスキーマの設計に関するメタデータは提供されます。主キーは、行の一意の識別子として他のテーブルがこの列セットに依存している可能性を示すためです。 注
|
PRIMARY KEY ( column_name [, ...] ) - table constraint | |
CHECK (expression) |
CHECK 句は、ブール値の結果を生成する式を指定します。この結果は、新しい行または更新された行が、挿入または更新操作を正常に行うために満たす必要があります。 式が TRUE または不明と評価されると正常に実行できます。 挿入または更新操作のいずれかの行の結果が FALSE だった場合、エラー例外が発生し、挿入または更新によるデータベース変更はされません。 列制約として指定されたチェック制約はその列の値のみを参照しますが、テーブル制約の式は複数の列を参照できます。 CHECK 式にサブクエリを含めたり、現在の行の列以外の変数を参照したりすることはできません。 |
REFERENCES reftable [ ( refcolumn ) ] [ ON DELETE action ] - column constraint |
これらの句は外部キー制約を指定します。新しいテーブルの 1 つ以上の列のグループに、参照テーブルの一部の行の参照列の値と一致する値のみが含まれている必要があります。 refcolumn を省略すると、reftable の主キーが使用されます。 参照列は、参照テーブルの一意性制約または主キー制約がある列である必要があります。 また、参照列のデータが変更されると、このテーブルの列のデータに対して特定のアクションが実行されます。 ON DELETE 句は、参照テーブルの参照行が削除されたときに実行するアクションを指定します。
制約が DEFERRABLE (延期可能) であっても、参照アクションを延期することはできません。 次に、各句で可能なアクションを示します。
参照列が頻繁に変更される場合は、外部キー列にインデックスを追加すると、外部キー列に関連する参照アクションをより効率的に実行できます。 |
FOREIGN KEY ( column [, ...] ) REFERENCES reftable [ ( refcolumn [, ...] ) ] [ ON DELETE action ] - table constraint | |
DEFERRABLE NOT | これは、制約を延期できるかどうかを制御します。 延期できない制約は、各文が実行された直後にチェックされます。 延期可能な制約のチェックは、SET CONSTRAINTS 文を使用することでトランザクションの終了まで延期できます。 NO DEFERRABLE がデフォルト値です。 外部キー制約のみがこの句を許容します。 他のすべての制約タイプは延期できません。 |
DEFERRABLE | |
INITIALLY IMMEDIATE | 制約が DEFERRABLE (延期可能) である場合、この句は制約をチェックするデフォルトの時間を指定します。 制約が INITIALLY IMMEDIATE の場合、各文の後にチェックされます。 この値がデフォルトです。 制約が INITIALLY DEFERRED の場合、トランザクションの終了時にのみチェックされます。 制約チェックの時間は、SET CONSTRAINTS 文を使用して変更できます。 |
INITIALLY DEFERRED | |
ON COMMIT | トランザクションブロック終了時の一時テーブルの動作は、ON COMMIT を使用して制御できます。 次の 2 つのオプションがあります。
|
TABLESPACE tablespace | tablespace は、新しいテーブルを作成するテーブルスペースの名前です。 指定しない場合、デフォルトのテーブルスペースが使用されます。 default_tablespace が空の文字列の場合、データベースのデフォルトのテーブルスペースが使用されます。 |
USING INDEX TABLESPACE tablespace | この句を使用すると、UNIQUE または PRIMARY KEY 制約に関連付けられたインデックスを作成するテーブルスペースを選択できます。 指定しない場合、デフォルトのテーブルスペースが使用されます。 default_tablespace が空の文字列の場合、データベースのデフォルトのテーブルスペースが使用されます。 |
説明
CREATE TABLE は、現在のデータベースに新しい、初期状態では空のテーブルを作成します。 テーブルは、文を実行するユーザーがオーナーとなります。
スキーマ名が指定されている場合 (例: CREATE TABLE myschema.mytable ...)、テーブルは指定されたスキーマに作成されます。 指定されない場合は、現在のスキーマに作成されます。 一時テーブルは特別なスキーマに存在するため、一時テーブルを作成する際はスキーマ名が指定できない場合があります。 テーブル名は、同じスキーマ内の他のテーブル、シーケンス、インデックス、またはビューの名前とは異なる名前である必要があります。
CREATE TABLE は、テーブルの 1 つの行に対応する複合データ型を表すデータ型も自動的に作成します。 したがって、テーブルは同じスキーマ内の既存のデータ型と同じ名前にすることはできません。
テーブルには 1,600 を超える列を含めることはできません。 実際にはタプル長制約があるため、有効制限はさらに低くなります。
- 列制約を列定義の一部として定義する。
- テーブル制約定義を特定の列に関連付けず、複数の列を含める。
例
dept テーブル と emp テーブルを作成します。
CREATE TABLE dept (
deptno NUMBER(2) NOT NULL CONSTRAINT dept_pk PRIMARY KEY,
dname VARCHAR2(14),
loc VARCHAR2(13)
);
CREATE TABLE emp (
empno NUMBER(4) NOT NULL CONSTRAINT emp_pk PRIMARY KEY,
ename VARCHAR2(10),
job VARCHAR2(9),
mgr NUMBER(4),
hiredate DATE,
sal NUMBER(7,2),
comm NUMBER(7,2),
deptno NUMBER(2) CONSTRAINT emp_ref_dept_fk
REFERENCES dept(deptno)
);
dept テーブルに一意性のテーブル制約を定義します。 一意性のテーブル制約は、テーブルの 1 つ以上の列に定義できます。
CREATE TABLE dept (
deptno NUMBER(2) NOT NULL CONSTRAINT dept_pk PRIMARY KEY,
dname VARCHAR2(14) CONSTRAINT dept_dname_uq UNIQUE,
loc VARCHAR2(13)
);
チェックの列制約を定義します。
CREATE TABLE emp (
empno NUMBER(4) NOT NULL CONSTRAINT emp_pk PRIMARY KEY,
ename VARCHAR2(10),
job VARCHAR2(9),
mgr NUMBER(4),
hiredate DATE,
sal NUMBER(7,2) CONSTRAINT emp_sal_ck CHECK (sal > 0),
comm NUMBER(7,2),
deptno NUMBER(2) CONSTRAINT emp_ref_dept_fk
REFERENCES dept(deptno)
);
チェックのテーブル制約を定義します。
CREATE TABLE emp (
empno NUMBER(4) NOT NULL CONSTRAINT emp_pk PRIMARY KEY,
ename VARCHAR2(10),
job VARCHAR2(9),
mgr NUMBER(4),
hiredate DATE,
sal NUMBER(7,2),
comm NUMBER(7,2),
deptno NUMBER(2) CONSTRAINT emp_ref_dept_fk
REFERENCES dept(deptno),
CONSTRAINT new_emp_ck CHECK (ename IS NOT NULL AND empno > 7000)
);
jobhist テーブルに主キーのテーブル制約を定義します。 主キーのテーブル制約は、テーブルの 1 つ以上の列に定義できます。
CREATE TABLE jobhist (
empno NUMBER(4) NOT NULL,
startdate DATE NOT NULL,
enddate DATE,
job VARCHAR2(9),
sal NUMBER(7,2),
comm NUMBER(7,2),
deptno NUMBER(2),
chgdesc VARCHAR2(80),
CONSTRAINT jobhist_pk PRIMARY KEY (empno, startdate)
);
以下により、job 列にリテラル定数のデフォルト値が割り当てられ、hiredate のデフォルト値は行が挿入される日付になります。
CREATE TABLE emp (
empno NUMBER(4) NOT NULL CONSTRAINT emp_pk PRIMARY KEY,
ename VARCHAR2(10),
job VARCHAR2(9) DEFAULT 'SALESMAN',
mgr NUMBER(4),
hiredate DATE DEFAULT SYSDATE,
sal NUMBER(7,2),
comm NUMBER(7,2),
deptno NUMBER(2) CONSTRAINT emp_ref_dept_fk
REFERENCES dept(deptno)
);
テーブルスペース diskvol1 に dept テーブルを作成します。
CREATE TABLE dept (
deptno NUMBER(2) NOT NULL CONSTRAINT dept_pk PRIMARY KEY,
dname VARCHAR2(14),
loc VARCHAR2(13)
) TABLESPACE diskvol1;