本トピックでは、テーブルの作成方法について説明します。

構文

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 を組み合わせたものにすぎません。 ただし、主キーとして列のセットを識別することでもスキーマの設計に関するメタデータは提供されます。主キーは、行の一意の識別子として他のテーブルがこの列セットに依存している可能性を示すためです。

  • 列制約またはテーブル制約どちらにおいても、テーブルに指定できる主キーは 1 つだけです。
  • 主キー制約では、列セットには同じテーブルで定義された、どの一意性制約によって名前が付けられた他の列セットとも異なる名前を付ける必要があります。
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 (延期可能) であっても、参照アクションを延期することはできません。 次に、各句で可能なアクションを示します。
  • CASCADE: 削除された行を参照するすべての行を削除するか、外部参照する列の値を参照列の新しい値に更新します。
  • SET NULL: 外部参照する列を NULL に設定します。

参照列が頻繁に変更される場合は、外部キー列にインデックスを追加すると、外部キー列に関連する参照アクションをより効率的に実行できます。

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 つのオプションがあります。
  • PRESERVE ROWS: トランザクションの終了時に特別なアクションは行われません。 これがデフォルトの動作です。 この動作は Oracle データベースと互換性がないことに注意してください。 Oracle のデフォルトは DELETE ROWS です。
  • DELETE ROWS: 一時テーブルのすべての行は、各トランザクションブロックの終了時に削除されます。 基本的に、自動 TRUNCATE がコミットごとに行われます。
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 を超える列を含めることはできません。 実際にはタプル長制約があるため、有効制限はさらに低くなります。

オプションの制約句では、新規または更新された行が挿入または更新操作を成功させるために満たす必要がある制約またはテストを指定します。 制約は、さまざまな方法でテーブル内の有効な値のセットを定義するのに役立つ SQL オブジェクトです。 制約を定義するには 2 つの方法があります。
  • 列制約を列定義の一部として定義する。
  • テーブル制約定義を特定の列に関連付けず、複数の列を含める。
すべての列制約は、テーブル制約として記述することもできます。 列制約は、制約が 1 つの列にのみ影響を与える場合に、表記上の便宜のために使用されます。
Oracle と互換性のある POLARDB は、一意性を強制するために、一意性制約と主キー制約それぞれにインデックスを自動的に作成します。 したがって、主キー列の明示的なインデックスを作成する必要はありません。

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;