すべてのプロダクト
Search
ドキュメントセンター

PolarDB:CREATE TABLE

最終更新日:Jun 05, 2024

テーブルを作成します。

構文

作成 [グローバルテンプレート] TABLE table_name (
  { column_name data_type [ DEFAULT default_expr ]
  [ column_constraint [ ... ] ] | table_constraint } [, ...]
  )
  [ ON COMMIT { PRESERVE ROWS | DELETE ROWS } ]
  [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 |
    初期にすぐに [] 

table_constraintパラメーターは、次の構文を使用します。

[ CONSTRAINT constraint_name]
  {UNIQUE ( column_name [, ...] )
      [ USING INDEX TABLESPACE tablespace ] |
    PRIMARYキー (column_name [, ...] )
      [ USING INDEX TABLESPACE tablespace ] |
    CHECK ( expression ) |
    FOREIGN KEY ( column_name [, ...] )
        REFERENCES reftable [ ( refcolumn [, ...] ) ]
      [ ON DELETE action ] }
  [ DEFERRABLE | NOT DEFERRABLE ]
  [初期に非難された | 初期に即時] 

説明

CREATE TABLE 文は、現在のデータベースに空のテーブルを作成します。 このテーブルは、コマンドを発行したユーザーが所有しています。

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

CREATE TABLEコマンドは、テーブル内の1行に関連付けられた複合データ型も自動的に作成します。 したがって、テーブルは同じスキーマ内の既存のデータ型と同じ名前にすることはできません。

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

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

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

パラメーター

パラメーター説明
GLOBAL TEMPORARY一時テーブルの作成を指定します。 一時テーブルと標準テーブルの違いは、データ管理にあります。 一時テーブルは、トランザクションとセッションの中間結果セットを格納します。 一時テーブルでは、格納されたデータは、テーブルが作成されたセッションにのみ表示されます。 他のセッションがコミットされていても、データは他のセッションには見えません。 一時テーブルはセッションによって分離されるため、一時テーブルに対して同時操作は実行されません。 一時テーブルは、トランザクションレベルの一時テーブルとセッションレベルの一時テーブルに分かれています。 詳細については、ON COMMIT 句をご参照ください。
table_name作成するテーブルの名前を指定します。 名前は、スキーマ固有とすることができる。
column_name新しいテーブルに作成する列の名前。
data_type作成する列のデータ型。 配列指定子を含めることができます。
DEFAULT default_exprDEFAULT句は、列定義を表示する列にデフォルトのデータ値を割り当てます。 この値は、変数を含まない任意の式です。 サブクエリまたは現在のテーブルの他の列への相互参照は許可されていません。 既定の式のデータ型は、列のデータ型と同じである必要があります。
説明 既定の式は、列の値を指定しない挿入操作で使用されます。 列にデフォルト値が指定されていない場合、デフォルト値はnullです。
TABLESPACEテーブルスペース。 カスタムテーブルスペースはサポートされていません。
CONSTRAINT constraint_name列制約またはテーブル制約のオプションの名前。 このパラメーターが指定されていない場合は、システムが名前を生成します。
NOT NULL列にnull値を含めることができないことを指定します。
NULL列にnull値を含めることができることを指定します。 デフォルト値です。

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

UNIQUE-列制約

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

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

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

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

PRIMARY KEY - column constraint

PRIMARY KEY ( column_name [, ...] ) - table constraint

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

列制約またはテーブル制約どちらにおいても、テーブルに指定できる主キーは 1 つだけです。

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

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

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

REFERENCES reftable [ ( refcolumn ) ] [ ON DELETE action ] - column constraint

外国キー (column [, ...] ) REFERENCES reftable [ ( refcolumn [, ...] ) ] [ON DELETEアクション]-テーブル制約

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

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

DEFERRABLE

NOT DEFERRABLE

このパラメーターは、制約を遅延できるかどうかを制御します。 延期可能でない制約は、各コマンドの直後にチェックされる。 SET CONSTRAINTSコマンドを実行して、トランザクションの終了まで延期可能な制約のチェックを延期できます。 NOT DEFERRABLE がデフォルト値です。 外部キー制約のみがこの句を許容します。 他のすべての制約タイプは延期できません。
INITIALLY IMMEDIATE

INITIALLY DEFERRED

制約が DEFERRABLE (延期可能) である場合、この句は制約をチェックするデフォルトの時間を指定します。 制約が INITIALLY IMMEDIATE の場合、各文の後にチェックされます。 デフォルト値です。 制約が INITIALLY DEFERRED の場合、トランザクションの終了時にのみチェックされます。 制約チェック時間を変更するには、SET CONSTRAINTSコマンドを実行します。
ON COMMITON COMMIT 句を使用して、トランザクションブロックの終了時における一時テーブルの動作を制御することができます。 次の 2 つのオプションが指定できます。
  • PRESERVE ROWS: セッションレベルの一時テーブルは、接続が閉じられるか、DELETEまたはTRUNCATEコマンドが実行されるまでデータを保持します。 一時テーブルのデータは、現在のセッションにのみ表示されます。 これはOracleデータベースと互換性がないことに注意してください。 Oracle データベースのデフォルト値は DELETE ROWS です。
  • DELETE ROWS: トランザクションレベルの一時テーブルは、COMMITまたはROLLBACKコマンドが実行されるまでデータを保持します。 トランザクションがコミットされた後、データは自動的に削除されます。 TRUNCATEコマンドは、コミット操作ごとに自動的に実行されます。
説明 PolarDB for PostgreSQL (Compatible with Oracle) は、一意性を強制するために、一意の制約と主キー制約のインデックスを自動的に作成します。 主キー列に明示的なインデックスを作成する必要はありません。 詳細については、CREATE INDEX をご参照ください。

deptテーブルとempテーブルを作成します。

テーブル部門の作成 (
    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 テーブルに一意性制約を定義します。 テーブルの1つ以上の列に一意のテーブル制約を定義できます。

テーブル部門の作成 (
    deptno NUMBER(2) NOT NULL CONSTRAINT dept_pk PRIMARY KEY,
    dname VARCHAR2(14) CONSTRAINT dept_dname_uq UNIQUE,
    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) CONSTRAINT emp_sal_ck CHECK (sal > 0),
    comm NUMBER(7,2),
    deptno NUMBER(2) CONSTRAINT emp_ref_dept_fk
                        参照部 (deptno)
); 

チェックテーブルの制約を定義します。

テーブル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 テーブルのプライマリキー制約を定義します。 テーブルの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;