CREATE TABLE

Name

CREATE TABLE  --  新しいテーブルの作成

Synopsis

CREATE [ TEMPORARY | TEMP ] TABLE table_name (
    { column_name type [ column_constraint [ ... ] ]
      | table_constraint }  [, ... ]
    ) [ INHERITS ( inherited_table [, ... ] ) ]

where column_constraint can be:
[ CONSTRAINT constraint_name ]
{ NOT NULL | NULL | UNIQUE | PRIMARY KEY | DEFAULT value | CHECK (condition) |
  REFERENCES table [ ( column ) ] [ MATCH FULL | MATCH PARTIAL ]
   [ ON DELETE action ] [ ON UPDATE action ]
   [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
}

and table_constraint can be:
[ CONSTRAINT constraint_name ]
{ UNIQUE ( column_name [, ... ] ) |
  PRIMARY KEY ( column_name [, ... ] ) |
  CHECK ( condition ) |
  FOREIGN KEY ( column_name [, ... ] ) REFERENCES table [ ( column [, ... ] ) ]
   [ MATCH FULL | MATCH PARTIAL ] [ ON DELETE action ] [ ON UPDATE action ]
   [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
}
  

入力

TEMPORARY または TEMP

指定されると、このセッションに対してのみテーブルが作成され、 セッション終了と同時に自動的に削除されます。 同じ名前で存在し ている永続的なテーブルは一時的テーブルが 存在している間は非可視で す。一時テーブル上に作られる全てのインデックスは自動的に 一時のものになります。

table_name

作成される新しいテーブルの名前です。

column_name

新しいテーブルに作られる列の名前です。

type

カラムの型です。配列の指定を含むこともあります。 データ型と配列についてより詳しくは PostgreSQL ユーザガイド を 参照して下さい。

inherited_table

オプションの INHERITS 句は、全てのフィールドをそのテーブルから 自動的に継承するテーブル名の集合を指定します。 継承された フィールド名が 1 つ以上あるときには、 Postgres はエラーを出します。 Postgres は、継承の階層の中でその 上位にあるテーブル上の継承関数を作成されたテーブルが継承する ことを無条件で認めています。

constraint_name

列またはテーブルの制約のオプションの名前です。指定されない 場合はシステムが名前を作ります。

value

列のデフォルト値です。より詳しくは DEFAULT 句を参照して下さい。

condition

CHECK 句は完全性保証制約を指定する、もしくは挿入か更新の操作が成功する ためにはどの新しいまたは更新された行を満たす必要があるかを テストします。それぞれの制約はブーリアンの結果を作る式で なければいけません。列定義の中に現れる条件は、その列の値のみを 参照するべきですが、テーブル制約として現れる条件は複数の列 であっても構いません。

table

外部キー制約に参照される既存テーブルの名前です。

column

外部キー制約に参照される既存テーブル中の列の名前です。 指定されない場合、既存テーブルの主キーが想定されます。

action

外部キー制約が違反された時にとる動作を示すキーワードです。

出力

CREATE

テーブルが正常に作成されたときに戻るメッセージです。

ERROR

テーブルの作成に失敗したときに戻るメッセージです。 通常以下の ような説明文が付いて来ます。 ERROR: Relation 'table' already exists データベースに既に指定したテーブルがある場合で、 実行時 に発生します。

説明

CREATE TABLE は指定したデータベースの中に新しく最初は 空であるテーブルを挿入します。 テーブルはこのコマン ドを発行したユーザの"所有"となります。

それぞれの type は単純な型、複雑な型(集合)、または配列型を指定することが できます。それぞれの属性は非 null に指定することができ、 DEFAULT 句 に指定されたデフォルト値を持つことができます。

Note: 属性内で矛盾のない配列次元は強制されていません。 将来のリリースではおそらく変わるでしょう。

CREATE TABLE はさらに、自動的にテーブルの 一行に対応するタプル型(構造の型)を表すデータ型を作成します。 したがって、テーブルはどの既存のデータ型とも同じ名前をもつことは できません。

オプションの INHERITS 句は、このテーブルが自動的に全てのフィールド を継承するテーブル名の集合を指定します。もし継承された フィールド名が一度以上現れる場合、Postgres はエラーを表示shます。 Postgres は作成されたテーブルが継承階層の一つ上のテーブルの 関数を継承することを自動的に許可します。関数の継承は Common Lisp Object System (CLOS) の規約に基づいて 行なわれます。

テーブルは 1600 列以上持つことができません(実践では、 タプル長制約のために効果的な制限は更に低くなります)。 テーブルはシステムカタログテーブルと同じ名前を持つことは できません。

DEFAULT 句

DEFAULT value
   

DEFAULT 句は、その列定義が現れる列のデフォルトデータ値を 割り当てます。その値は任意の無変数式です(現在のテーブル内の 他の列への副セレクトと交差参照はサポートされていないので 注意してください)。デフォルト値のデータ型はカラム定義のデータ型 に一致しなければなりません。

DEFAULT 式は列に値を指定しない任意の INSERT 操作で使われます。 もし DEFAULT 句がない場合、デフォルトは NULL です。

使用方法

CREATE TABLE distributors (
    name     VARCHAR(40) DEFAULT 'luso films',
    did      INTEGER  DEFAULT NEXTVAL('distributors_serial'),
    modtime  TIMESTAMP DEFAULT now()
);
    
上記は列 name にリテラル定数デフォルト値を 割り当て、列 did のデフォルト値が シーケンスオブジェクトの次の値を選択することで作られるように 設定します。modtime のデフォルト値は その行が挿入された時間になります。

    modtime  TIMESTAMP DEFAULT 'now'
    
上記がおそらく意図したものとは異なる結果をもたらすことは 注目しておく価値があります。文字列 'now' は即座に timestamp 値に型強制され、したがって modtime のデフォルト値は常にテーブル作成 の時間になります。この問題はデフォルト値を関数呼び出しとして 指定することで回避できます。

列制約

[ CONSTRAINT constraint_name ] {
    NULL | NOT NULL | UNIQUE | PRIMARY KEY | CHECK condition |
    REFERENCES reftable [ ( refcolumn ) ]
     [ MATCH matchtype ]
     [ ON DELETE action ] 
     [ ON UPDATE action ]
     [ [ NOT ] DEFERRABLE ] 
     [ INITIALLY checktime ] }
   

入力

constraint_name

制約句に与えられる任意の名前です。

NULL

列には NULL 値があっても構いません。そしてこれはデフォルトです。

NOT NULL

列に NULL 値があってはいけません。 これはカラム制約 CHECK ((column NOT NULL) と等価です。

UNIQUE

列に一意の値がなければなりません。 Postgres では、列上に UNIQUE インデックスを自動的に作成することで、適用されます。

PRIMARY KEY

この列は主キーで、 他のテーブルがこの列を行 に対する一意な識別子として参照することが出来るようになります。 UNIQUE と NOT NULL は両方とも PRIMARY KEY で暗示されます。 さらに詳しい情報は PRIMARY KEY を見て下さい。

condition

任意のブーリアン値を持つ制約条件です。

説明

オプションの制約句は制約を指定するか、あるいはどの新しい又は更新 された行が挿入か更新操作を成功させるのに必要かをテストします。

制約とは、名前の付いているルールで、テーブル上で実行された INSERT、 UPDATE または DELETE 操作の結果に制限を加えることによって有効な値の 一群の定義を手助けする SQL オブジェクトです。

完全性保証制約条件を定義する方法は、後で述べるテーブル制約条件と、 ここで述べる列制約条件の二つがあります。

列制約条件は列定義の一部として定義される、 データの完全性を保証する 制約条件で、理論上、作成された時点でテーブル制約条件となります。 カラム制約条件として有効なものは 以下のものです。

PRIMARY KEY
REFERENCES
UNIQUE
CHECK
NOT NULL

NOT NULL 制約

[ CONSTRAINT name ] NOT NULL 
   

NOT NULL 制約条件は、カラムが 非 NULL 値のみというルールを 指定します。これは、カラム制約条件のみに対するものであって、 テーブル制約条件としては認められていません。

出力

status

ERROR: ExecAppend: Fail to add null value in not null attribute "column".

実行時、NOT NULL 制約事項のある列に NULL 値を挿入しよう とした時に起こるエラーです。

説明

使用方法

一つが明示的に名前を与えられているテーブル distributors 上に二つの NOT NULL 列制約条件を設定します。

CREATE TABLE distributors (
    did      DECIMAL(3) CONSTRAINT no_null NOT NULL,
    name     VARCHAR(40) NOT NULL
);
     

UNIQUE 制約

[ CONSTRAINT constraint_name ] UNIQUE
   

入力

constraint_name

制約句に与えられる任意の名前です。

出力

status

ERROR: Cannot insert a duplicate key into a unique index.

このエラーは、列に複製の値を挿入しようとした場合に 実行時に起こります。

説明

UNIQUE 制約条件は、テーブルの一つ以上の独立したそれぞれの 列のグループが一意の値しか持つことが出来ないというルールを指定します。

指定されたカラムのカラム定義は、UNIQUE 制約条件に含まれる NOT NULL 制約条件を持ってはなりません。NOT NULL 制約条件 のないカラムに一つ 以上の NULL 値があっても UNIQUE 制約条件 に違反しません。 (このことは SQL92 定義から逸脱しますが、 より意味のある取り決めです。詳細は互換性の節を参照して下さい。)

それぞれの UNIQUE カラム制約条件は、そのテーブルに対して 指名された他のいかなる UNIQUE または PRIMARY KEY 制約条件 によって指名されたカラムの一群と異なるカラムを指名しな ければなりません。

Note: データの完全性を保証するため、Postgres はそれぞれの UNIQUE 制約条件に対して自動的に一意の インデックス を作成します。より詳しくは、CREATE INDEX を参照して下さい。

使用方法

下記は name 列に UNIQUE 制約を定義します。

CREATE TABLE distributors (
    did      DECIMAL(3),
    name     VARCHAR(40) UNIQUE
);
  
これは下記でテーブル制約として指定されるものと同等です。
CREATE TABLE distributors (
    did      DECIMAL(3),
    name     VARCHAR(40),
    UNIQUE(name)
);
     

CHECK 制約

[ CONSTRAINT constraint_name ] CHECK ( condition )
   

入力

constraint_name

制約条件句に与えられる任意の名前です。

condition

ブール値の結果を評価する有効な任意の条件式です。

出力

status

ERROR: ExecAppend: rejected due to CHECK constraint "constraint_name".

実行時に違法の値が、CHECK 制約条件となる列に 挿入されようとしたときに出力され るエラーです。

説明

CHECK 制約は列内で有効な値に対しての一般的な制約を指定します。 CHECK 制約条件はテーブル制約条件としても有効です。

CHECK はテーブルの一つ以上の列を含む一般的なブーリアン式 を指定します。そのブーリアン式が行の値に適用されたときに FALSE と評価されると、新しい行は拒絶されます。

現時点では、CHECK 式は副選択を含んだり、現在の行のフィールド 以外の変数を参照することはできません。

SQL92 の標準は CHECK 列制約は適用する列のみを参照できると 言っています。CHECK テーブル制約のみが複数の列を参照することが できます。Postgres はこの制約を 強制しません。列とテーブル CHECK 制約は同等に扱われます。

PRIMARY KEY 制約

[ CONSTRAINT constraint_name ] PRIMARY KEY 
   

入力

constraint_name

制約句に与えられる任意の名前です。

出力

ERROR: Cannot insert a duplicate key into a unique index.

実行時に重複した値が、PRIMARY KEY 制約条件となる列に 挿入されようとしたときに出力されるエラーです。

説明

PRIMARY KEY 列制約条件は、テーブルの列には一意の(重複しない)、 NULL でない値のみであることを指定します。 指定されたカラムの 定義では、PRIMARY KEY 制約条件に含まれる暗黙的な NOT NULL 制約条件を持つ必要はありません。

テーブルに対し一つの PRIMARY KEY のみが、列制約かテーブル制約か を指定できます。

注釈

データの完全性を保証するため、Postgres は自動的に一意のインデックスを作成します。 (CREATE INDEX 文を参照して下さい。)

PRIMARY KEY では、同じテーブルに定義された UNIQUE 制約条件に よって指定されたカラムの他の一群と異なったカラムの一群を指定 しなければなりません。というのは、同じインデックスを複製した り、 余分な、役に立たない実行時における作業のオーバヘッドを排除 するためです。 とは言っても、Postgres は特別にこのことを認めていないわけではありません。

REFERENCES 制約

[ CONSTRAINT constraint_name ] REFERENCES reftable [ ( refcolumn ) ] 
    [ MATCH matchtype ]
    [ ON DELETE action ] 
    [ ON UPDATE action ]
    [ [ NOT ] DEFERRABLE ] 
    [ INITIALLY checktime ]
   

REFERENCES 制約は列の値が別の列の値とチェックされるルール を指定します。REFERENCES は更に FOREIGN KEY テーブル制約 の一部として指定することもできます。

入力

constraint_name

制約句に与えられる任意の名前です。

reftable

チェックをするデータを持つテーブルです。

refcolumn

データをチェックする reftable の列です。これが指定されない場合は、 reftable の PRIMARY KEY が使われます。

MATCH matchtype

MATCH 型には三つあります。MATCH FULL、 MATCH PARTIAL、そして 指定がない場合はデフォルト match 型です。MATCH FULL は、 全ての外部キー列が NULL でない限り複数列の外部キーの一列 が NULL になることを認めません。デフォルトの MATCH 型 は、外部キーの他の部分が NULL ではない間、いくつかの外部キー列が NULL になることを認めます。MATCH PARTIAL は現在のところ サポートされていません。

ON DELETE action

参照されるテーブルの参照される行が削除されるときに 行なう動作です。下記のものがあります。

NO ACTION

外部キーが違反されたときにエラーにします。 これはデフォルトです。

RESTRICT

NO ACTION と同じです。

CASCADE

削除された行を参照する任意の行を削除します。

SET NULL

列の参照値を NULL に設定します。

SET DEFAULT

列の参照値をデフォルト値に設定します。

ON UPDATE action

参照されるテーブルの参照される列が新しい値に更新される ときに行なう動作です。もし行が更新され、しかし参照される 列が変わっていない場合、何も動作は起きません。 動作には以下のものがあります。

NO ACTION

外部キーが違反された場合エラーにします。 これがデフォルトです。

RESTRICT

NO ACTION と同じです。

CASCADE

参照する列の値をその列の新しい値に更新します。

SET NULL

参照する列の値を NULL に設定します。

SET DEFAULT

参照する列の値をデフォルト値に設定します。

[ NOT ] DEFERRABLE

これは、制約がトランザクションの終りまで延期できるかどうかを 管理します。 DEFERRABLEの場合、 SET CONSTRAINTS ALL DEFERRED は外部キーがトランザクションの終りでのみチェックするように します。デフォルトは NOT DEFERRABLE です。

INITIALLY checktime

checktime は 制約をチェックするデフォルトの時間を指定する二つの 可能な値を持っています。

DEFERRED

トランザクションの終りでのみ制約をチェックします。

IMMEDIATE

それぞれの文のあとで制約をチェックします。これが デフォルトです。

出力

status

ERROR: name referential integrity violation - key referenced from table not found in reftable

このエラーは、参照されるテーブルに照合する列を持たない 列に値を挿入しようとした場合の実行時に起こります。

説明

REFERENCES 列制約はテーブルの列が参照されるテーブルの参照される 列にある値と照合する値のみを持つことができると指定します。

この列に追加される値は、与えられた match 型を使って、参照される テーブルと参照される列の値に照合されます。更に、参照される 列データが変更されると、動作はこの列の照合するデータ上で 実行されます。

注釈

現在のところ Postgres は MATCH FULL とデフォルト match 型のみをサポートしています。 更に、参照される列は参照されるテーブルの UNIQUE 制約の列 であるはずですが、Postgres は それを強制しません。

テーブル制約

[ CONSTRAINT name ] { PRIMARY KEY |  UNIQUE } ( column [, ... ] )
[ CONSTRAINT name ] CHECK ( constraint )
[ CONSTRAINT name ] FOREIGN KEY ( column [, ... ] ) 
                     REFERENCES reftable [ ( refcolumn [, ... ] ) ]
                      [ MATCH matchtype ] 
                      [ ON DELETE action ] 
                      [ ON UPDATE action ]
                      [ [ NOT ] DEFERRABLE ] 
                      [ INITIALLY checktime ]
   

入力

constraint_name

制約句に与えられる任意の名前です。

column [, ... ]

一意のインデックスを定義する列名で、PRIMARY KEY には NOT NULL 制約です。

CHECK ( constraint )

制約として評価されるブーリアン式です。

出力

テーブル制約句への可能な出力は列制約句の対応する部分と同じです。

説明

テーブル制約はテーブルの一つ以上の列に定義される 完全性保証制約条件です。"テーブル制約" の四つのバリエーション は以下です。

UNIQUE
CHECK
PRIMARY KEY
FOREIGN KEY

UNIQUE 制約

[ CONSTRAINT constraint_name ] UNIQUE ( column [, ... ] )
    

入力

constraint_name

制約句に与えられる任意の名前です。

column

テーブル内の列名です。

出力

status

ERROR: Cannot insert a duplicate key into a unique index

実行時に重複した値が挿入されようとしたとき に出力されるエラーです。

説明

UNIQUE 制約はテーブルの一つ以上の特定の列のグループが一意な 値のみを保持できることを指定します。 UNIQUE テーブル制約の 動作は列制約と同じで、更に複数の列に渡る機能があります。

詳細は UNIQUE 列制約の節を見て下さい。

使用方法

テーブル配布者の中で複製の行を禁止します。

CREATE TABLE distributors (
    did      DECIMAL(3),
    name     VARCHAR(40),
    UNIQUE(did,name)
);
     

PRIMARY KEY Constraint

[ CONSTRAINT constraint_name ] PRIMARY KEY ( column [, ... ] ) 
    

入力

constraint_name

制約句に与えられる任意の名前です。

column [, ... ]

テーブル内の一つ以上の列の名前です。

出力

status

ERROR: Cannot insert a duplicate key into a unique index.

実行時に重複した値が、 PRIMARY KEY 制約条件となるカラムに 挿入されようとしたときに出力されるエラーです。

説明

PRIMARY KEY 制約条件は、テーブルの一つ以上の独立したそれぞれ のカラムのグループが一意で、(重複しないで)、なお NULL でない 値のみが許されるというルールを指定します。 指定されたカラムのカラ ム定義では、PRIMARY KEY 制約条件に含まれる NOT NULL 制約条件を含ん ではいけません。

PRIMARY KEY テーブル制約条件は、カラム制約条の件の PRIMARY KEY 制約条件と類似したものですが、複数のカラムに拡張した追加機能が あります。

より詳しくは、PRIMARY KEY カラム制約条件の節を参照して下さい。

REFERENCES 制約

[ CONSTRAINT constraint_name ] FOREIGN KEY ( column [, ... ] )
    REFERENCES reftable [ ( refcolumn [, ... ] ) ] 
    [ MATCH matchtype ]
    [ ON DELETE action ] 
    [ ON UPDATE action ]
    [ [ NOT ] DEFERRABLE ]
    [ INITIALLY checktime ]
   

REFERENCES 制約は列の値または列の値の集合が別のテーブルの値 とチェックされることを指定します。

入力

constraint_name

制約句に与えられる任意の名前です。

column [, ... ]

テーブル内の一つ以上の列の名前です。

reftable

チェックをするデータを持つテーブルです。

referenced column [, ... ]

reftable 内でデータをチェックする一つ以上の列です。指定されない 場合、reftable の PRIMARY KEY が使われます。

MATCH matchtype

MATCH 型には三つあります。MATCH FULL、 MATCH PARTIAL、そして 指定がない場合はデフォルト match 型です。MATCH FULL は、 全ての外部キー列が NULL でない限り複数列の外部キーの一列 が NULL になることを認めません。デフォルトの MATCH 型 は、外部キーの他の部分が NULL ではない間、いくつかの外部キー列が NULL になることを認めます。MATCH PARTIAL は現在のところ サポートされていません。

ON DELETE action

参照されるテーブルの参照される行が削除されるときに行なわれる 動作です。以下の動作があります。

NO ACTION

外部キーが違反された場合にエラーを表示します。 これがデフォルトです。

RESTRICT

NO ACTION と同じです。

CASCADE

削除された行を参照する行を削除します。

SET NULL

参照する列の値を NULL に設定します。

SET DEFAULT

参照する列の値をデフォルトに設定します。

ON UPDATE action

参照されるテーブルの参照される列が新しい値に更新される ときに行なう動作です。もし行が更新され、しかし参照される 列が変わっていない場合、何も動作は起きません。 動作には以下のものがあります。

NO ACTION

外部キーが違反されるとエラーを表示します。 これはデフォルトです。

RESTRICT

参照される行の更新を不可能にします。

CASCADE

参照する列の値を参照される列の新しい値に更新します。

SET NULL

参照する列の値を NULL に設定します。

SET DEFAULT

参照する列の値をデフォルト値に設定します。

[ NOT ] DEFERRABLE

これは、制約がトランザクションの終りまで延期できるかどうかを 管理します。 DEFERRABLEの場合、 SET CONSTRAINTS ALL DEFERRED は外部キーがトランザクションの終りでのみチェックするように します。デフォルトは NOT DEFERRABLE です。

INITIALLY checktime

checktime は 制約をチェックするデフォルトの時間を指定する可能な 値を二つ持っています。

IMMEDIATE

それぞれの文の後で制約をチェックします。これがデフォルト です。

DEFERRED

トランザクションの終りのみで制約をチェックします。

出力

status

ERROR: name referential integrity violation - key referenced from table not found in reftable

このエラーは、参照されるテーブルに照合する列を持たない 列に値を挿入しようとした場合の実行時に起こります。

説明

FOREIGN KEY 制約はテーブルの一つ以上の特定の列が参照される テーブルの特定の列と関連することを指定します。

FOREIGN KEY テーブル制約は列制約と似ていますが、複数のカラムに 拡張した追加機能があります。

詳細は FOREIGN KEY 列制約の節を参照して下さい。

使用方法

テーブル films とテーブル distributors を作ります。

CREATE TABLE films (
     code      CHARACTER(5) CONSTRAINT firstkey PRIMARY KEY,
     title     CHARACTER VARYING(40) NOT NULL,
     did       DECIMAL(3) NOT NULL,
     date_prod DATE,
     kind      CHAR(10),
     len       INTERVAL HOUR TO MINUTE
);
   
CREATE TABLE distributors (
     did      DECIMAL(3) PRIMARY KEY DEFAULT NEXTVAL('serial'),
     name     VARCHAR(40) NOT NULL CHECK (name <> '')
);
   

二次元配列を持つテーブルを作ります。

   CREATE TABLE array (
          vector INT[][]
          );
   

テーブル films に UNIQUE テーブル制約を定義します。 UNIQUE テーブル制約はそのテーブルの一つ以上の 列に定義することができます。

CREATE TABLE films (
    code      CHAR(5),
    title     VARCHAR(40),
    did       DECIMAL(3),
    date_prod DATE,
    kind      CHAR(10),
    len       INTERVAL HOUR TO MINUTE,
    CONSTRAINT production UNIQUE(date_prod)
);
   

CHECK 列制約を定義します。

CREATE TABLE distributors (
    did      DECIMAL(3) CHECK (did > 100),
    name     VARCHAR(40)
);
   

CHECK テーブル制約を定義します。

CREATE TABLE distributors (
    did      DECIMAL(3),
    name     VARCHAR(40)
    CONSTRAINT con1 CHECK (did > 100 AND name > '')
);
   

テーブル films に PRIMARY KEY テーブル制約を定義します。 PRIMARY KEY テーブル制約はテーブルの一つ以上の列に 定義することができます。

CREATE TABLE films (
    code      CHAR(5),
    title     VARCHAR(40),
    did       DECIMAL(3),
    date_prod DATE,
    kind      CHAR(10),
    len       INTERVAL HOUR TO MINUTE,
    CONSTRAINT code_title PRIMARY KEY(code,title)
);
   

テーブル配布に PRIMARY KEY 列制約を定義します。PRIMARY KEY 列制約はテーブルの一つの列上にのみ定義することができます。 (以下の二つの例は同じものです。)

CREATE TABLE distributors (
    did      DECIMAL(3),
    name     CHAR VARYING(40),
    PRIMARY KEY(did)
); 
   
CREATE TABLE distributors (
    did      DECIMAL(3) PRIMARY KEY,
    name     VARCHAR(40)
);
   

互換性

SQL92

ローカルに可視的な暫定テーブルに加え、SQL92 では CREATE GLOBAL TEMPORARY TABLE 文と、オプションでの ON COMMIT 句も同時に定義しています。

CREATE GLOBAL TEMPORARY TABLE table ( column type [
    DEFAULT value ] [ CONSTRAINT column_constraint ] [, ... ] )
    [ CONSTRAINT table_constraint ] [ ON COMMIT { DELETE | PRESERVE } ROWS ] 
   

暫定テーブルに対し、CREATE GLOBAL TEMPORARY TABLE 文はほかのクライ アントに可視的な新しいテーブルを指名し、テーブルのカラムと制約条件 を定義します。

CREATE TEMPORARY TABLE のオプションの ON COMMIT 句は、 COMMIT が実行された時、一時テーブルの行を空にするかどうかを指定します。 ON COMMIT 句が省略された場合、SQL92 はデフォルトが ON COMMIT DELETE ROWS であると指定しています。しかし Postgres の動作は常に ON COMMIT PRESERVE ROWS のようになります。

UNIQUE 句

SQL92 はいくつかの追加機能を UNIQUE に指定しています。

テーブル制約の定義です。

[ CONSTRAINT constraint_name ] UNIQUE ( column [, ... ] )
    [ { INITIALLY DEFERRED | INITIALLY IMMEDIATE } ]
    [ [ NOT ] DEFERRABLE ]
     

列制約の定義です。

[ CONSTRAINT constraint_name ] UNIQUE
      [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
      [ [ NOT ] DEFERRABLE ]
     

NULL 句

NULL "制約" (実際は非制約です)は SQL92 の Postgres 拡張で、NOT NULL 句 と対称になっています(そして他のいくつかの RDBMS との 比較用でもあります)。どの列でもこれがデフォルトなので その存在は邪魔なだけです。

[ CONSTRAINT constraint_name ] NULL 
     

NOT NULL 句

SQL92 はいくつかの追加機能を NOT NULL に指定しています。

[ CONSTRAINT constraint_name ] NOT NULL 
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]
     

CONSTRAINT 句

SQL92 はいくつかの追加機能を制約にしてしており、 さらに表明とドメイン制約も定義しています。

Note: Postgres はまだドメインも 表明もサポートしていません。

表明は特殊な型の完全性保証制約条件で、他の制約と同じ名前空間 を共有しています。しかし、表明は制約のように特定のテーブル に依存する必要はありませんので、SQL-92 は 制約を定義する 代替メソッドとして CREATE ASSERTION 文を提供しています。

CREATE ASSERTION name CHECK ( condition )
    

ドメイン制約は CREATE DOMAIN または ALTER DOMAIN 文で 定義されています。

下記はドメイン制約です。

[ CONSTRAINT constraint_name ] CHECK constraint 
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]
     

下記はテーブル制約定義です。

[ CONSTRAINT constraint_name ] { PRIMARY KEY ( column, ... ) | FOREIGN KEY constraint | UNIQUE constraint | CHECK constraint }
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]
     

下記は列制約定義です。

[ CONSTRAINT constraint_name ] { NOT NULL | PRIMARY KEY | FOREIGN KEY constraint | UNIQUE | CHECK constraint }  
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]
     

CONSTRAINT 定義は一つの延期属性句または一つの初期制約モード句 を任意の順番で持つことができます。

NOT DEFERRABLE

制約はそれぞれの文の最後にチェックされなければなりません。 SET CONSTRAINTS ALL DEFERRED はこの制約の型には何の影響 も持ちません。

DEFERRABLE

これは制約がトランザクションの最後まで延期できるかどうかを 管理します。もし SET CONSTRAINTS ALL DEFERRED が使われるか または制約が INITIALLY DEFERRED の場合、外部キーが トランザクションの最後にのみチェックされるようになります。

Note: SET CONSTRAINTS は外部キー制約を 現在のトランザクションのみの適用に変えます。

INITIALLY IMMEDIATE

それぞれの文の後で制約をチェックします。これがデフォルトです。

INITIALLY DEFERRED

トランザクションの最後のみで制約をチェックします。

CHECK 句

SQL92 は CHECK にテーブルまたは列制約でいくつかの追加機能 を指定しています。

下記はテーブル制約の定義です。

[ CONSTRAINT constraint_name ] CHECK ( VALUE condition ) 
      [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
      [ [ NOT ] DEFERRABLE ]
     

下記は列制約の定義です。

[ CONSTRAINT constraint_name ] CHECK ( VALUE condition ) 
      [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
      [ [ NOT ] DEFERRABLE ]
    

PRIMARY KEY 句

SQL92 は PRIMARY KEY にいくつかの追加機能を指定しています。

下記はテーブル制約定義です。

[ CONSTRAINT constraint_name ] PRIMARY KEY ( column [, ... ] ) 
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]
     

下記は列制約定義です。

[ CONSTRAINT constraint_name ] PRIMARY KEY 
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]
     

継承

INHERITS 句による複数継承は Postgres 言語の拡張です。SQL99 (SQL92 ではありませんが) は異なった 構文と異なった意味論を使った単一継承を定義しています。 SQL99 方式の継承はまだ Postgres ではサポートされていません。