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

PolarDB:テーブルの作成

最終更新日:May 24, 2024

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

構文

作成 [グローバルテンプレート] 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パラメーターの説明をご参照ください。
説明
  • 一時テーブルが永続テーブルと同じ名前を共有する場合、永続テーブルがスキーマ修飾名を使用して参照されない限り、永続テーブルは現在のセッションでは表示されません。
  • 一時テーブルは、現在のセッションでのみ表示されます。 このメカニズムは、Oracleデータベースのグローバルな一時テーブルメカニズムとは異なります。
  • 一時テーブルに作成されるインデックスは一時的なインデックスです。
テーブル名テーブルの名前。
説明 このテーブルを参照するには、スキーマ修飾名を使用できます。
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制約の組み合わせです。 ただし、主キーが一連の列で構成されている場合は、スキーマのメタデータを指定する必要があります。 これは、主キーが、他のテーブルが行の一意の識別子としてこの列のセットに依存できることを意味するためです。

説明
  • 主キーが列制約として使用されるか、テーブル制約として使用されるかにかかわらず、各テーブルには主キーを1つだけ持つことができます。
  • PRIMARY KEY制約にリストされている列は、テーブルの他のUNIQUE制約で使用しないでください。
PRIMARY KEY ( column_name [, ...] ) - table constraint
CHECK (expression)

ブール値の結果を生成するために使用される式。 この式はCHECK句で指定します。

INSERTまたはUPDATE操作は、この式がtrueまたはunknownに評価された場合にのみ成功します。 それ以外の場合、操作は失敗し、エラーが返されます。 列にCHECK制約を定義する場合、列に書き込むことができる値を制限できます。 テーブルにCHECK制約を定義する場合、テーブルの複数の列に書き込むことができる値を制限できます。

説明 この式には、現在の行の列以外の変数へのサブクエリまたは参照を含めることはできません。
REFERENCES reftable [ ( refcolumn ) ] [ ON DELETE action ] - column constraint

これらの句は、外部キー制約を指定します。 外部キー制約では、作成されたテーブルの列の値が参照テーブルの列に存在する必要があります。 refcolumnパラメーターが指定されていない場合、reftableパラメーターで指定されたテーブルのプライマリキーが使用されます。 参照される列は、参照されるテーブルのUNIQUE制約またはPRIMARY KEY制約の列である必要があります。

参照される列のデータが変更された場合、このテーブルの列に対して同じ変更操作が実行されます。 ON DELETE句は、参照テーブルの参照行が削除されているときに実行するアクションを指定します。 制約が延期可能であっても、参照アクションを延期することはできません。 ON DELETE句は、次の参照アクションをサポートします。
  • CASCADE: 削除された行を参照する行を削除するか、参照される列の値を反映する列の値を更新します。
  • SET NULL: 参照列の値をNULLに設定します。
説明 参照先の列の値が頻繁に変更される場合は、外部キー列にインデックスを追加することを推奨します。 このようにして、外部キー列に関連付けられた参照アクションを効率的に実行することができる。
外国キー (column [, ...] ) REFERENCES reftable [ ( refcolumn [, ...] ) ] [ON DELETEアクション]-テーブル制約
DEFERRABLE NOT制約を延期できるかどうかを指定します。 延期できない制約は、各ステートメントが実行された直後にチェックされます。 SET CONSTRAINTSステートメントを使用して、延期可能な制約のチェックを延期できます。 制約のチェックを延期すると、トランザクションが終了するまで制約はチェックされません。

NOT DEFERRABLEはデフォルト値です。 外部キー制約のみが、DEFERRABLEおよびNOT DEFERRABLE値をサポートします。 他の制約は延期できません。

DEFERRABLE
INITIALLY IMMEDIATE指定された遅延可能制約がチェックされた時刻。

INITIALLY IMMEDIATE値は、各ステートメントの実行後に制約がチェックされることを指定します。 INITIALLY IMMEDIATEがデフォルト値です。

INITIALLY DEFERRED値は、トランザクションの終了後に制約がチェックされることを指定します。

SET CONSTRAINTSステートメントを実行して、制約がチェックされる時間を変更できます。
INITIALLY DEFERRED
ON COMMITトランザクションブロックの最後にある一時テーブルで実行されるアクション。 デフォルト値: PRESERVE ROWS。 有効な値:
  • PRESERVE ROWS: 各トランザクションブロックの最後に特別なアクションは実行されません。
    説明 デフォルト値は、Oracleデータベースのデフォルト値とは異なります。 Oracleデータベースのデフォルト値はDELETE ROWSです。
  • DELETE ROWS:一時テーブルのすべての行は、各トランザクションブロックの終了時に削除されます。 基本的に、TRUNCATE操作は、コミット操作が実行されるたびに自動的に実行されます。

説明

CREATE TABLE文は、現在のデータベースにテーブルを作成します。 テーブルは最初は空です。 ステートメントを実行するユーザーがテーブルの所有者です。

ステートメントでスキーマ名を指定すると、指定したスキーマにテーブルが作成されます。 それ以外の場合は、テーブルは現在のスキーマ内に作成されます。 たとえば、CREATE TABLE myschema.mytableステートメントを実行すると、myschemaスキーマにmytableテーブルが作成されます。 作成するテーブルが一時テーブルの場合は、スキーマを指定する必要はありません。 一時テーブルは専用スキーマに存在します。 テーブル名は、同じスキーマ内の他のテーブル、シーケンス、インデックス、およびビューの名前とは異なる必要があります。

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

テーブルには最大1,600列を含めることができます。 実際には、タプルの長さに対する制約のために、テーブルは1,600より少ない列を含むことができる。

オプションの制約は、INSERTまたはUPDATE操作の制約またはテスト条件を指定します。 INSERTまたはUPDATE操作は、操作が制約条件またはテスト条件を満たしている場合にのみ成功します。 制約は、テーブルに書き込むことができるデータの値を制限するために使用できるSQLオブジェクトです。 PolarDBは、複数の制約方法を提供する。 制約は、列制約またはテーブル制約として定義できます。
  • 列制約は、単一の列に対して定義される。
  • テーブル制約は、テーブル内の複数の列で定義されます。
テーブル管理を簡素化するために、列制約を1つの列のみのテーブル制約として定義できます。
説明 PolarDBは、一意性を強制するために、UNIQUE制約とPRIMARY KEY制約ごとにインデックスを自動的に作成します。 この方法では、主キーに含まれる各列に明示的なインデックスを作成する必要はありません。

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;