本トピックでは、テーブルの作成方法について説明します。
構文
作成 [グローバルテンプレート] TABLE table_name (
{ column_name data_type [ DEFAULT default_expr ]
[column_constraint [ ... ] ] table_constraint } [, ...]
)
[COMMIT { PRESERVE ROWS DELETE ROWS } ]
[TABLESPACEテーブルスペース] 上記の構文では、column_constraintは次の制約のいずれかに設定できます。[ CONSTRAINT constraint_name]
{NOT NULL
NULL
UNIQUE [インデックスTABLESPACEテーブルスペースを使用]
基本キー [インデックスTABLESPACEテーブルスペースを使用]
CHECK (expression)
REFERENCES reftable [ ( refcolumn ) ]
[ ON DELETE action ] }
[耐え難い] [当初は耐え難い]
table_constraintは、次のいずれかの制約に設定できます。[ CONSTRAINT constraint_name]
{UNIQUE ( column_name [, ...] )
[インデックスTABLESPACEテーブルスペースを使用]
PRIMARYキー (column_name [, ...] )
[インデックスTABLESPACEテーブルスペースを使用]
CHECK (式)
FOREIGN KEY ( column_name [, ...] )
REFERENCES reftable [ ( refcolumn [, ...] ) ]
[ ON DELETE action ] }
[卑劣ではない卑劣]
[初期に定義された初期にすぐに] パラメーター
| パラメーター | 説明 |
| GLOBAL TEMPORARY | このパラメーターを指定すると、結果のテーブルは一時テーブルになります。 一時テーブルは、現在のセッションが終了すると自動的に削除されます。 トランザクションの完了後に一時テーブルを手動で削除することもできます。 詳細については、この表のON COMMITパラメーターの説明をご参照ください。 説明
|
| テーブル名 | テーブルの名前。 説明 このテーブルを参照するには、スキーマ修飾名を使用できます。 |
| column name | テーブルに作成する列の名前。 |
| データ型 | 列のデータ型。 値には、配列指定子を含めることができます。 |
| DEFAULT default_expr | 定義された列のデフォルト値を生成するために使用される式。 この式は、DEFAULT句で指定します。 この式には、サブクエリまたはテーブル内の他の列への参照を含めることはできません。 この既定の式のデータ型は、列のデータ型と同じである必要があります。 列に値が挿入されていない場合、この既定の式を使用して値が生成されます。 既定の式を指定しない場合、使用される値はNULLです。 |
| CONSTRAINT constraint_name | 構成する列またはテーブル制約の名前。 constraint_nameパラメーターはオプションです。 このパラメーターを空のままにすると、列またはテーブル制約の名前が自動的に生成されます。 |
| NOT NULL | 列にNULL値を含めることができないことを指定します。 |
| PRIMARY KEY - column constraint | 1つ以上の列に、テーブルの各行を一意に識別する値を含める必要があり、NULL値を含めることはできません。 PRIMARY KEY制約は、UNIQUE制約とNOT NULL制約の組み合わせです。 ただし、主キーが一連の列で構成されている場合は、スキーマのメタデータを指定する必要があります。 これは、主キーが、他のテーブルが行の一意の識別子としてこの列のセットに依存できることを意味するためです。 説明
|
| PRIMARY KEY ( column_name [, ...] ) - table constraint | |
| CHECK (expression) | ブール値の結果を生成するために使用される式。 この式は INSERTまたはUPDATE操作は、この式がtrueまたはunknownに評価された場合にのみ成功します。 それ以外の場合、操作は失敗し、エラーが返されます。 列にCHECK制約を定義する場合、列に書き込むことができる値を制限できます。 テーブルにCHECK制約を定義する場合、テーブルの複数の列に書き込むことができる値を制限できます。 説明 この式には、現在の行の列以外の変数へのサブクエリまたは参照を含めることはできません。 |
| REFERENCES reftable [ ( refcolumn ) ] [ ON DELETE action ] - column constraint | これらの句は、外部キー制約を指定します。 外部キー制約では、作成されたテーブルの列の値が参照テーブルの列に存在する必要があります。 参照される列のデータが変更された場合、このテーブルの列に対して同じ変更操作が実行されます。 ON DELETE句は、参照テーブルの参照行が削除されているときに実行するアクションを指定します。 制約が延期可能であっても、参照アクションを延期することはできません。 ON DELETE句は、次の参照アクションをサポートします。
説明 参照先の列の値が頻繁に変更される場合は、外部キー列にインデックスを追加することを推奨します。 このようにして、外部キー列に関連付けられた参照アクションを効率的に実行することができる。 |
| 外国キー (column [, ...] ) REFERENCES reftable [ ( refcolumn [, ...] ) ] [ON DELETEアクション]-テーブル制約 | |
| DEFERRABLE NOT | 制約を延期できるかどうかを指定します。 延期できない制約は、各ステートメントが実行された直後にチェックされます。 SET CONSTRAINTSステートメントを使用して、延期可能な制約のチェックを延期できます。 制約のチェックを延期すると、トランザクションが終了するまで制約はチェックされません。
|
| DEFERRABLE | |
| INITIALLY IMMEDIATE | 指定された遅延可能制約がチェックされた時刻。 INITIALLY IMMEDIATE値は、各ステートメントの実行後に制約がチェックされることを指定します。 INITIALLY IMMEDIATEがデフォルト値です。 INITIALLY DEFERRED値は、トランザクションの終了後に制約がチェックされることを指定します。 SET CONSTRAINTSステートメントを実行して、制約がチェックされる時間を変更できます。 |
| INITIALLY DEFERRED | |
| ON COMMIT | トランザクションブロックの最後にある一時テーブルで実行されるアクション。 デフォルト値: PRESERVE ROWS。 有効な値:
|
説明
CREATE TABLE文は、現在のデータベースにテーブルを作成します。 テーブルは最初は空です。 ステートメントを実行するユーザーがテーブルの所有者です。
ステートメントでスキーマ名を指定すると、指定したスキーマにテーブルが作成されます。 それ以外の場合は、テーブルは現在のスキーマ内に作成されます。 たとえば、CREATE TABLE myschema.mytableステートメントを実行すると、myschemaスキーマにmytableテーブルが作成されます。 作成するテーブルが一時テーブルの場合は、スキーマを指定する必要はありません。 一時テーブルは専用スキーマに存在します。 テーブル名は、同じスキーマ内の他のテーブル、シーケンス、インデックス、およびビューの名前とは異なる必要があります。
CREATE TABLEステートメントは、データ型も自動的に作成します。 データ型は、テーブルの行に対応する複合型を表します。 テーブル名は、同じスキーマ内の既存のデータ型の名前と同じにすることはできません。
テーブルには最大1,600列を含めることができます。 実際には、タプルの長さに対する制約のために、テーブルは1,600より少ない列を含むことができる。
- 列制約は、単一の列に対して定義される。
- テーブル制約は、テーブル内の複数の列で定義されます。
例
deptとempの2つのテーブルを作成します。
テーブル部門の作成 (
deptno NUMBER(2) NOT NULL CONSTRAINT dept_pk PRIMARY KEY,
dname VARCHAR2(14),
loc VARCHAR2 (13)
);
テーブル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
参照部 (deptno)
); dept テーブルに一意性制約を定義します。 テーブル内の複数の列に一意のテーブル制約を定義できます。
テーブル部門の作成 (
deptno NUMBER(2) NOT NULL CONSTRAINT dept_pk PRIMARY KEY,
dname VARCHAR2(14) CONSTRAINT dept_dname_uq UNIQUE,
loc VARCHAR2 (13)
); 列レベルのCHECK制約を定義する:
テーブル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
参照部 (deptno)
); テーブルレベルのCHECK制約を定義する:
テーブル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はNULLではなく、empno > 7000)
); jobhistテーブルにテーブルレベルのPRIMARY KEY制約を定義します。 テーブルレベルのPRIMARY KEY制約は、テーブルの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)
); ジョブ列のデフォルト値としてリテラル定数を設定し、hiredate列のデフォルト値を行が挿入された日付に設定します。
テーブル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
参照部 (deptno)
); diskvol1テーブルスペースにdeptという名前のテーブルを作成します。
テーブル部門の作成 (
deptno NUMBER(2) NOT NULL CONSTRAINT dept_pk PRIMARY KEY,
dname VARCHAR2(14),
loc VARCHAR2 (13)
) TABLESPACE diskvol1;