CREATE TABLE は、現在のデータベースに新しい空のテーブルを作成します。このステートメントを実行したユーザーがテーブル所有者になります。テーブルを作成した後、INSERT を使用して行を追加し、ALTER TABLE を使用してその構造を変更したり、制約を追加したりします。
構文
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 | 現在のセッションの終了時に自動的に削除される一時テーブルを作成します。一時テーブル上に作成されたインデックスも一時的なものになります。一時テーブルが永続テーブルと同じ名前を共有する場合、スキーマ修飾名で参照されない限り、永続テーブルは現在のセッションでは表示されません。 |
table_name | テーブルの名前です。必要に応じて、スキーマ修飾名を使用してテーブルを参照します。 |
column_name | テーブル内の列の名前です。 |
data_type | 列のデータ型です。この値には配列指定子を含めることができます。 |
DEFAULT default_expr | 列のデフォルト値の式です。この式には、サブクエリやテーブル内の他の列への参照を含めることはできません。また、そのデータ型は列のデータ型と一致する必要があります。値が挿入されず、デフォルトが定義されていない場合は、NULL が使用されます。 |
CONSTRAINT constraint_name | 列制約またはテーブル制約のオプションの名前です。省略した場合、システムが自動的に名前を生成します。 |
NOT NULL | 列に NULL 値が含まれることを防ぎます。 |
PRIMARY KEY (列制約) | 列の値は、各行を一意に識別し、かつ NULL 以外である必要があります。1つのテーブルにはプライマリキーを1つしか設定できません。プライマリキーの列は、UNIQUE 制約に含めることはできません。PolarDB は、プライマリキーを強制するために自動的にインデックスを作成します。 |
PRIMARY KEY ( column_name [, ...] ) (テーブル制約) | 複数の列にまたがる複合プライマリキーを定義します。 |
CHECK (expression) | INSERT または UPDATE 操作を成功させるには、このブール式が true または不明と評価される必要があります。この式には、サブクエリや現在の行以外の変数への参照を含めることはできません。 |
REFERENCES reftable [ ( refcolumn ) ] [ ON DELETE action ] (列制約) | 外部キー制約を定義します。refcolumn が省略された場合、reftable のプライマリキーが使用されます。参照される列は、参照先テーブルの UNIQUE または PRIMARY KEY 制約に属している必要があります。参照される列が頻繁に変更される場合は、外部キー列にインデックスを追加して、参照アクションの効率を維持します。 |
FOREIGN KEY ( column [, ...] ) REFERENCES reftable [ ( refcolumn [, ...] ) ] [ ON DELETE action ] (テーブル制約) | 複数の列にまたがる外部キー制約を定義します。 |
ON DELETE action | 参照されている行が削除されたときに実行されるアクションです。参照アクションは、制約が遅延可能であっても遅延させることはできません。サポートされているアクション: CASCADE (削除された行を参照する行を削除または更新する) および SET NULL (参照している列の値を NULL に設定する)。 |
DEFERRABLE / NOT DEFERRABLE | 制約チェックをトランザクションの終了まで遅延できるかどうかを指定します。遅延可能な制約を遅延させるには、SET CONSTRAINTS を使用します。このオプションをサポートするのは外部キー制約のみです。他のすべての制約は遅延不可能です。デフォルト: NOT DEFERRABLE。 |
INITIALLY IMMEDIATE / INITIALLY DEFERRED | 遅延可能な制約がチェックされるタイミングを指定します。INITIALLY IMMEDIATE は各ステートメントの後に制約をチェックします (デフォルト)。INITIALLY DEFERRED はトランザクションの終了時にチェックします。ランタイムでこれをオーバーライドするには、SET CONSTRAINTS を使用します。 |
ON COMMIT | トランザクションブロックの終了時に一時テーブルに対して実行するアクションです。PRESERVE ROWS (デフォルト) はすべての行を保持します。DELETE ROWS はすべての行を削除し、各コミットで TRUNCATE を実行するのと同じです。 |
TABLESPACE tablespace | テーブルを作成する表領域です。 |
注意事項
スキーマ名が含まれている場合 (例:
CREATE TABLE myschema.mytable)、テーブルはそのスキーマに作成されます。それ以外の場合は、現在のスキーマに作成されます。一時テーブルは常に専用のスキーマに存在します。作成時にスキーマを指定しないでください。
テーブル名はスキーマ内で一意でなければなりません。既存のテーブル、シーケンス、インデックス、またはビューの名前と重複することはできません。
CREATE TABLEは、テーブルの行を表す複合データ型も作成します。テーブル名は、同じスキーマ内の既存のデータ型の名前と一致することはできません。1つのテーブルには最大 1,600 列まで含めることができます。実際には、タプルの長さの制約により、有効な上限はこれより低くなる場合があります。
列制約は単一の列に適用されます。テーブル制約は複数の列にまたがって適用されます。管理の便宜上、単一列の制約はどちらの形式でも記述できます。
PolarDB は、各
UNIQUEおよびPRIMARY KEY制約に対して自動的にインデックスを作成します。明示的にインデックスを作成する必要はありません。
互換性に関する注意事項
PolarDB for Oracle の CREATE TABLE は、以下の点で Oracle データベースとは動作が異なります:
一時テーブルの可視性:一時テーブルは現在のセッションでのみ表示されます。この仕組みは、Oracle データベースのグローバル一時テーブルの仕組みとは異なります。
ON COMMITのデフォルト:デフォルトの動作はPRESERVE ROWSです。Oracle では、デフォルトはDELETE ROWSです。
例
2つの関連テーブルの作成
次の例では、dept テーブルと、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)
);UNIQUE 制約の追加
CREATE TABLE dept (
deptno NUMBER(2) NOT NULL CONSTRAINT dept_pk PRIMARY KEY,
dname VARCHAR2(14) CONSTRAINT dept_dname_uq UNIQUE,
loc VARCHAR2(13)
);列レベルの CHECK 制約の追加
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)
);テーブルレベルの CHECK 制約の追加
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)
);複合プライマリキーの定義
次の例では、empno と startdate に複合プライマリキーを持つ jobhist テーブルを作成します。
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 列のデフォルトは 'SALESMAN' です。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)
);特定の表領域でのテーブル作成
CREATE TABLE dept (
deptno NUMBER(2) NOT NULL CONSTRAINT dept_pk PRIMARY KEY,
dname VARCHAR2(14),
loc VARCHAR2(13)
) TABLESPACE diskvol1;次のステップ
既存のテーブルの構造や制約を変更するには、
ALTER TABLEを使用します。テーブルを削除するには、
DROP TABLEを使用します。プライマリキーと一意性制約のために自動的に作成されるインデックス以外にインデックスを追加するには、
CREATE INDEXを使用します。テーブルにデータを入力するには、
INSERTを使用します。