テーブルを作成します。

構文

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 ]

説明

CREATE TABLE 文は、現在のデータベースに空のテーブルを作成します。 テーブルは、文を実行するユーザーが所有することになります。

スキーマ名を指定した場合 (例えば、CREATE TABLE myschema.mytable を指定した場合) は、テーブルは指定されたスキーマ内に作成されます。 それ以外の場合は、テーブルは現在のスキーマ内に作成されます。 一時テーブルは特別なスキーマ内に存在します。 したがって、一時テーブルを作成するときにスキーマ名を指定する必要はありません。 テーブル名は、同じスキーマ内の他のすべてのテーブル、シーケンス、インデックス、またはビューとは異なる必要があります。

CREATE TABLE 文は、テーブルの行に対応する複合データ型を自動的に作成します。 したがって、テーブルは同じスキーマ内の既存のデータ型と同じ名前にすることはできません。

テーブルには最大 1,600 列を持つことができます。 実際には、タプルの長さの制約があるため、現実の制限値はそれより低くなります。

オプションの制約句は、新規または更新された行が挿入または更新操作を成功させるために満たす必要がある制約またはテストを指定します。 制約は、テーブル内の有効な値のセットを定義するのに役立つ SQL オブジェクトです。

制約は、テーブル制約と列制約に分類されます。 列制約は、列定義の一部として定義されます。 テーブル制約定義は特定の列に依存せず、複数の列を含めることができます。 各列制約は、テーブル制約として記述することもできます。 制約が 1 つの列のみに影響する場合は、その制約は列制約です。 つまり、列制約は表記上の便宜にすぎません。

パラメーター

パラメーター 説明
GLOBAL TEMPORARY このパラメーターを指定すると、テーブルは一時テーブルとして作成されます。 一時テーブルは、セッションの終了時または現在のトランザクションの終了時に自動的に削除されます。 詳細については、ON COMMIT 句をご参照ください。 一時テーブルが存在する場合、同じ名前の既存の永続テーブルは、一時テーブルがスキーマ修飾された名前で参照されない限り、現在のセッションからは見えません。 一時テーブルは、それが作成されたセッションの外では見えません。 グローバル一時テーブルのこの側面は、Oracle データベースと互換性がありません。 一時テーブルに作成されたすべてのインデックスは自動的に一時的になります。
table_name 作成するテーブルの名前。 名前はスキーマで修飾することができます。
column_name 新しいテーブルに作成する列の名前。
data_type 列のデータ型。 配列指定子を含めることができます。
DEFAULT default_expr DEFAULT 句は、列にデフォルトのデータ値を割り当てます。 この値は、変数を含まない任意の式です。 サブクエリまたは現在のテーブルの他の列への相互参照は許可されていません。 デフォルトの式のデータ型は、列のデータ型と同じである必要があります。
デフォルトの式は、列の値を指定しない挿入操作で使用されます。 列にデフォルト値が指定されていない場合は、デフォルト値は null です。
CONSTRAINT constraint_name 列またはテーブル制約の名前 (オプション)。 このパラメーターが指定されていない場合は、システムが名前を生成します。
NOT NULL 列に null 値を含めることはできません。
NULL 列には null 値を含めることができます。 これがデフォルト値です。

この句は、非標準の SQL データベースとの互換性のためにのみ使用することができます。 新しいアプリケーションではこの句を使用しないことを推奨します。

UNIQUE -- 列制約

UNIQUE (column_name [, ...] ) -- テーブル制約

UNIQUE 制約は、テーブルの 1 つ以上の異なる列のグループに一意の値のみを含めることができることを指定します。 テーブルの一意性制約の動作は、複数の列にまたがり得ることを除いて、列制約の動作と同じです。

一意制約が評価されるとき、null 値は等しいとは見なされません。

テーブルの一意性制約は列のセットに名前を付ける必要があり、それは、同じテーブルに定義された他の一意性制約またはプライマリキー制約が定義するものとは異なっている必要があります。 そうでない場合は、同じ制約が 2 回リストされます。

PRIMARY KEY -- 列制約

PRIMARY KEY ( column_name [, ...] ) -- テーブル制約

プライマリキー制約は、テーブルの 1 つ以上の列に、一意で重複していない非 null 値のみを含めることができることを指定します。 PRIMARY KEY は UNIQUE とNOT NULL の組み合わせです。 PRIMARY KEY は、一連の列をプライマリキーとして識別し、スキーマの設計に関するメタデータを提供します。 プライマリキーは、他のテーブルがこの列のセットを、行に対する一意の識別子であると信頼できることを意味します。

テーブルに指定できるプライマリキーは 1 つだけで、列制約またはテーブル制約として指定できます。

プライマリキー制約は列のセットに対して名前を付ける必要があり、これは同じテーブルに定義された他の一意性制約によって名付けられた列セットとは異なっている必要があります。

CHECK (expression) CHECK 句は、ブール値の結果を生成する式を指定します。この式は、行の新規作成または更新操作が成功するために、満足すべき条件となります。 式が TRUE または不明と評価された場合は、INSERT または UPDATE 操作が成功します。 行の挿入または更新操作の結果が FALSE の場合は、エラーが発生し、挿入または更新によってデータベースが変更されることはありません。 列制約として指定されたチェック制約は、その列の値のみを参照する必要があります。 テーブル制約の式は、複数の列を参照することができます。

CHECK 式にはサブクエリを含まず、現在の行にある列以外の変数を参照することもできません。

REFERENCES reftable [ ( refcolumn ) ] [ ON DELETE action ] -- 列制約

FOREIGN KEY ( column [, ...] ) REFERENCES reftable [ ( refcolumn [, ...] ) ] [ ON DELETE action ] -- テーブル制約

これらの句は、外部キー制約を指定します。 新しいテーブルの 1 つ以上の列のグループには、参照されるテーブルの行の参照される列の値と一致する値のみが含まれている必要があります。 refcolumn を省略すると、reftable のプライマリキーが使用されます。 参照される列は、参照されるテーブルの一意性制約またはプライマリキー制約の列である必要があります。
また、参照される列のデータが変更されると、このテーブルの列のデータに対してアクションが実行されます。 ON DELETE 句は、参照されるテーブルの参照される行が削除されるときに実行するアクションを指定します。 制約が遅延可能であっても、参照アクションを遅延することはできません。 各句で可能なアクションは次のとおりです。
  • CASCADE:削除された行を参照するすべての行を削除するか、参照している列の値を参照される列の新しい値に更新します。
  • SET NULL:参照している列を NULL に設定します。

参照される列が頻繁に変更される場合は、外部キー列にインデックスを追加して、外部キー列に関連付けられた参照アクションを容易にすることができます。

DEFERRABLE

NOT DEFERRABLE

このパラメーターは、制約を遅延できるかどうかを制御します。 遅延できない制約は、各文の直後にチェックされます。 SET CONSTRAINTS 文を使用して、遅延可能な制約のチェックをトランザクションの終了まで遅延させることができます。 NOT DEFERRABLE がデフォルト値です。 外部キー制約のみがこの句を受け入れます。 他のすべての制約型は遅延可能ではありません。
INITIALLY IMMEDIATE

INITIALLY DEFERRED

制約が遅延可能な場合は、この句は制約をチェックするデフォルトの時期を指定します。 制約が INITIALLY IMMEDIATE の場合は、各文の後にチェックされます。 これがデフォルト値です。 制約が INITIALLY DEFERRED の場合は、トランザクションの終了時にのみチェックされます。 SET CONSTRAINTS 文を使用して、制約チェック時期を変更することができます。
ON COMMIT ON COMMIT 句を使用して、トランザクションブロックの終了時における一時テーブルの動作を制御することができます。 次の 2 つのオプションが指定できます。
  • PRESERVE ROWS:各トランザクションの終了時に特別なアクションは実行されません。 これがデフォルトの動作です。 この点は Oracle データベースと互換性がないことにご注意ください。 Oracle データベースのデフォルト値は DELETE ROWS です。
  • DELETE ROWS:一時テーブルのすべての行は、各トランザクションブロックの終了時に削除されます。 コミット操作ごとに自動的に TRUNCATE が実行されます。
TABLESPACE tablespace tablespace は、新しいテーブルが作成されるテーブルスペースの名前です。 テーブルスペースを指定しない場合は、default_tablespace が使用されます。 default_tablespace が空の文字列の場合は、データベースのデフォルトのテーブルスペースが使用されます。
USING INDEX TABLESPACE tablespace この句を使用すると、UNIQUE 制約または PRIMARY KEY 制約に関連付けられたインデックスが作成されるテーブルスペースを選択することができます。 テーブルスペースを指定しない場合は、default_tablespace が使用されます。 default_tablespace が空の文字列の場合は、データベースのデフォルトのテーブルスペースが使用されます。
Oracle 互換 PolarDB データベースは、一意性を強制するために、一意性制約およびプライマリキー制約ごとにインデックスを自動的に作成します。 プライマリキー列の明示的なインデックスを作成する必要はありません。 詳細については、CREATE INDEX をご参照ください。

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;