CREATE TABLE

Name

CREATE TABLE  --  新しいテーブルを作成する。

Synopsis

CREATE [ TEMPORARY | TEMP ] TABLE table (
    column type
    [ NULL | NOT NULL ] [ UNIQUE ] [ DEFAULT value ]
    [column_constraint_clause | PRIMARY KEY } [ ... ] ]
    [, ... ]
    [, PRIMARY KEY ( column [, ...] ) ]
    [, CHECK ( condition ) ]
    [, table_constraint_clause ]
    ) [ INHERITS ( inherited_table [, ...] ) ]
  

入力

TEMPORARY

このセッションに対してのみテーブルが作成され、セッション 終了時に自動的に削除されます。 一時テーブルが存在している間、その同じ名前で存在する永続 的なテーブルを参照することができません。

table

作成する、新しいクラスもしくはテーブルの名前。

column

列名。

type

列の型。 配列指定を含むことができます。 データ型と配列に関する詳細な情報については、 PostgreSQL ユーザガイド を参照して下さい。

DEFAULT value

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

column_constraint_clause

オプションの列制約句は、挿入/更新操作が正常に行なわれる ために、新規/更新項目が満たさなければならない、整合 性制約、もしくは検査事項のリストを指定します。 各制約はブール式で評価されなければなりません。 SQL92 では column_constraint_clause は該当列のみを参照することが要求されていますが、 Postgres では、1 つの列制約内 で複数の列を参照することができます。 より詳しくは列制約句を参照して下さい。

table_constraint_clause

オプションのテーブル制約句は、挿入/更新操作が正常に行なわれる ために、新規/更新項目が満たさなければならない、整合性 制約のリストを指定します。 各制約はブール式で評価されなければなりません。 1 つの制約内で複数の列を参照することができます。 1 つのテーブルに対し、1 つだけ PRIMARY KEY 句を指定することが できます。 PRIMARY KEY column (テーブル制約) と PRIMARY KEY (列制約) は互いに排他的です。 より詳しくは テーブル制約句を参照して下さい。

INHERITS inherited_table

オプションの INHERITS 句は、このテーブルが自動的に全て のフィールドを継承する、テーブル名の集合を指定します。 継承されたフィールド名に重複があった場合、 Postgres はエラーを報告します。 Postgres では自動的に、作成された テーブルは継承階層でその上位にあるテーブルの関数を継承するこ とができます。

出力

CREATE

テーブルが正常に作成された場合に返されるメッセージ。

ERROR

テーブルの作成に失敗した場合に返されるメッセージ。 これは通常、以下のような何らかの説明文が同時に出力されます。 ERROR: Relation 'table' already exists このメッセージは、指定したテーブルが既にデータベース内に存 在していた、その実行時に発生します。

ERROR: DEFAULT: type mismatched

デフォルト値のデータ型がその列定義におけるデータ型と 一致しなかった場合。

説明

CREATE TABLE は現在のデータベースにクラス、 もしくは、テーブルを新規に登録します。 テーブルはこのコマンドを発行したユーザによって "所有" されます。

type は、単純な型、複雑な型(セット)、もしくは、配列型をとることが できます。 各属性は、 DEFAULT 句 を使用して、NULL を持たないように指定することも、デフォルト 値を持つように指定することもできます。

Note: Postgres バージョン 6.0 以降、属性内の配列次元数に対する制約 は強制されていません。 これは将来のリリースでは変更する予定です。

オプションの INHERITS 句は、このテーブルが自動的に全てのフィー ルドを継承する、テーブル名の集合を指定します。 継承されたフィールド名に重複があった場合、Postgres はエラーを 報告します。 Postgres では自動的に、作成された テーブルは継承階層でその上位にあるテーブルの関数を継承するこ とができます。 関数の継承は Common Lisp オブジェクトシステム(CLOS)の慣習に 従って行なわれます。

新しい、table テーブル/ クラスは、それぞれ、自動的に型として作成されます。 そのため、そのクラスからの 1 つ以上のインスタンスは自動的に型になり、 ALTER TABLE や別の CREATE TABLE 文で使用することができます。

新しいテーブルは、初期データを持たないヒープとして作成されます。 テーブルには 1600 以上の列を持たせることはできません。 (これは実際には、 タプルサイズは8192 バイト未満でなければなら ないことによる制限です。) しかし、この制限はサイトによっては、もっと少なく設定されてい るかもしれません。

DEFAULT 句

DEFAULT value
   

入力

value

デフォルト値の式に使用可能な値には、次のものがあります。

  • リテラル値。

  • ユーザ関数。

  • ニラディック関数。

出力

なし。

説明

DEFAULT 句は (CREATE TABLE 文内の列定義経由で) 列にデ フォルト値を代入します。 デフォルト値のデータ型は列定義におけるデータ型に一致しな ければなりません。

対象にデフォルト値の指定のない列を含む INSERT 操作は、 明示的なデータ値が与えられていなければ、その列に NULL 値を代入します。 デフォルトの literal は、指定した定数値がそのデフォルトとなることを意味します。 デフォルトの niladic-function 、及び、 user-function は、INSERT 実行時点における指定した関数の結果がそのデフォ ルトになることを意味します。

次の 2 種類のニラディック関数があります。

ニラディックな USER 関数

CURRENT_USER / USER

CURRENT_USER 関数を参照して下さい。

SESSION_USER

SESSION_USER 関数を参照して下さい。 (訳注: CURRENT_USER → SESSION_USER として訳。)

SYSTEM_USER

未実装。

ニラディックな日付関数

CURRENT_DATE

CURRENT_DATE 関数を参照して下さい。

CURRENT_TIME

CURRENT_TIME 関数を参照して下さい。

CURRENT_TIMESTAMP

CURRENT_TIMESTAMP 関数を参照して下さい。

使用法

デフォルトとして didnumber 列に定数を、 did 列に文字リテラルを代入します。

CREATE TABLE video_sales (
    did      VARCHAR(40) DEFAULT 'luso films',
    number   INTEGER DEFAULT 0,
    total    CASH DEFAULT '$0.0'
);
    

デフォルトとして、did 列に既存 のシーケンスを、name 列にリテ ラルを代入します。

CREATE TABLE distributors (
    did      DECIMAL(3)  DEFAULT NEXTVAL('serial'),
    name     VARCHAR(40) DEFAULT 'luso films'
);
    

列制約句

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

入力

name

この整合性制約に付与する任意の名前。 name の指定がない場合、 name が確実に一意になるように、テーブル名と列名から名 前が生成されます。

NULL

この列は NULL 値を持つことができます。 これはデフォルトです。

NOT NULL

この列は NULL 値を持つことができません。 これは、 CHECK (column NOT NULL) という列制約と同一です。

UNIQUE

列は一意な値を持たなければなりません。 Postgres では、これはそのテー ブルに暗黙的に作成される一意インデックスによって行なわ れます。

PRIMARY KEY

この列はプライマリキーです。つまり、システムによって 一意性が維持され、他のテーブルから行の一意な識別子として この列が参照可能であることを意味します。 より詳しくは、PRIMARY KEY を参照して下さい。

constraint

制約の定義。

説明

オプションの列制約句は、挿入/更新操作が正常に行なわれる ために、新規/更新項目が満たさなければならない、整合 性制約、もしくは検査事項のリストを指定します。 各制約はブール式で評価されなければなりません。 1 つの列制約内で複数の列を参照することができます。 テーブル制約としての PRIMARY KEY の使用と列制約としての PRIMARY KEY の使用は互いに非互換です。

制約とは、 SQL オブジェクトである、名前付きのルールです。 この SQL オブジェクトは、ベーステーブルに対する INSERT、 UPDATE、及び、DELETE 操作結果に対して制限を付与すること によって、有効な値集合の定義を補助します。

整合性制約を定義する方法には 2 つの方法があります。 後述の、テーブル制約とここで説明する、列制約です。

列制約は列定義の一部分として定義される整合性 制約であり、論理的には、生成された時点でテーブル制約に なります。 列制約には、次のものが使用できます。

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 テーブルに 2 つの NOT NULL 列制約を定義します。 このうち、1つは 名前付き制約です。

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

UNIQUE 制約

[ CONSTRAINT name ] UNIQUE
   

入力

CONSTRAINT name

制約に付与する任意の名前。

出力

status

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

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

説明

UNIQUE 制約は、あるテーブル内にある 1 つ以上の別々の列から なるグループが一意な値のみを持つことができるというルールを指 定します。

1 つの UNIQUE 制約に含めるように指定される列の 列定義では、NOT NULL 制約を含める必要はありません。 列に NOT NULL 制約がない場合に 1 つ以上の NULL 値 を持つことは、UNIQUE 制約に違反しません。 (これは、SQL92 定義から逸脱していま すが、より意味のある規約です。より詳細については互換性 の節を参照して下さい。)

各 UNIQUE 列制約は、そのテーブルで定義された他の全ての UNIQUE または PRIMARY KEY 制約で指名された列群とは異な る列を指名しなければなりません。

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

使用法

distributors テーブルに、UNIQUE 列制約を定義します。 UNIQUE 列制約はテーブルの 1 列に対してのみ定義 することができます。

CREATE TABLE distributors (
    did      DECIMAL(3),
    name     VARCHAR(40) UNIQUE
);
  
これは、次のテーブル制約で指定したものと同一です。
CREATE TABLE distributors (
    did      DECIMAL(3),
    name     VARCHAR(40),
    UNIQUE(name)
);
     

CHECK 制約

[ CONSTRAINT name ] CHECK
    ( condition [, ...] ) 
   

入力

name

制約に付与する任意の名前。

condition

評価の結果がブール値となる、任意の有効な条件式。

出力

status

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

このエラーは、CHECK 制約に従う列に不正な値を挿 入しようとした、その実行時に起こります。

説明

CHECK 制約はある列で許される値に対する制限を指定します。 また CHECK 制約はテーブル制約としても使用できます。

SQL92 における CHECK 列制約はテーブルの 1 列に対し てのみ定義でき、その列のみを参照できます。 Postgres には、この制限はありません。

PRIMARY KEY 制約

[ 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 属性を含める必要はありません。

1 つのテーブルに 1 つの PRIMARY KEY のみを指定することができます。

注意

Postgres は、データの整合性を保 証するために一意インデックスを自動的に作成します。

PRIMARY KEY は、同一テーブルに対して定義された全ての UNIQUE 制約で指名された列の集合と、異なる列の集合を指名しな ければなりません。 というのは、これにより同一のインデックスが二重に生成され、実 行時に非生産的なオーバヘッドが増えてしまうからです。 しかし、Postgres は特にこれを禁止 していません。

REFERENCES 制約

[ 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 FULL、MATCH PARTIAL、及び、何も指定がない場合の デフォルトの一致方法という 3 種類の一致方法があります。 MATCH FULL の場合、複数列からなる外部キーの 1 つの列 は、全ての外部キーの列が NULL でない限り、NULL を持つことができません。 (訳注: つまり全てが NULL 値になる場合を除いて、NULL 値を持つことができません。) デフォルトの一致方法の場合、外部キーの他の部分が NULL でなけ れば、複数列からなる外部キーのいくつかの列は 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 は、2 つの値を取ることができます。

DEFERRED

トランザクションの終了時にのみ制約を検査します。

IMMEDIATE

各文の実行終了後、制約を検査します。 これがデフォルトです。

出力

status

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

このエラーは、被参照テーブルに一致する列が存在しな い値を列に挿入しようとした、その実行時に起こります。

説明

REFERENCES 列制約は、テーブルの列が被参照テーブルの 被参照列の値に一致する値のみを持つことを指定します。

この列に追加される値は指定された一致方法を使用して、被参 照テーブルと被参照列の値と比較されます。 更に、被参照列のデータが変更された場合に、その列に一 致するデータに対して動作が実行されます。

注意

現在の Postgres では、MATCH FULL とデ フォルトの一致方法のみがサポートされています。 更に、被参照列には、被参照テーブルにおける 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 )

制約として評価されるブール式。

出力

テーブル制約句で起こり得る出力は、列制約句の対応する部分と同一です。

説明

テーブル制約はベーステーブルの複数の列に対して定義された 整合性制約です。 "テーブル制約" には、次の 4 種類があります。

UNIQUE
CHECK
PRIMARY KEY
FOREIGN KEY

UNIQUE 制約

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

入力

CONSTRAINT name

制約に付与する任意の名前。

column

テーブル内の列名。

出力

status

ERROR: Cannot insert a duplicate key into a unique index

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

説明

UNIQUE 制約は、あるテーブル内にある 1 つ以上の別々の列から なるグループが一意な値のみを持つことができるというルールを指 定します。 UNIQUE テーブル制約の動作は、列制約における UNIQUE 制約 と同一ですが、複数の列に対して設定できるという追加機能が あります。

より詳細については、UNIQUE 列制約の節を参照して下さい。

使用法

distributors テーブルに、UNIQUE テーブル制約を定義します。

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

PRIMARY KEY 制約

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

入力

CONSTRAINT name

制約に対する任意の名前。

column [, ...]

テーブル内の 1 つ以上の列名。

出力

status

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

これは、PRIMARY KEY 制約に従う列に重複する値を挿入し ようとした、その実行時に起こります。

説明

PRIMARY KEY 列制約は、テーブルの 1 つ以上の別々の列 からなるグループが一意(重複しない)、かつ、非 NULL 値のみを 持つというルールを指定します。 PRIMARY KEY 制約に含めるように指定される列の定義には NOT NULL 属性を含める必要はありません。

PRIMARY KEY テーブル制約は列制約における PRIMARY KEY 制 約と似ていますが、複数列を含むことができるという追加機 能があります。

より詳しくは、PRIMARY KEY 列制約の節を参照して下さい。

REFERENCES 制約

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

REFERENCES 制約は、列値が他の列の値に対して検査 されるというルールを指定します。 REFERENCES はまた、FOREIGN KEY テーブル制約の一部として 指定することもできます。

入力

CONSTRAINT name

制約に対する任意の名前。

column [, ...]

このテーブル内の 1 つ以上の列名。

reftable

検査対象とするデータを持つテーブル。

referenced column [, ...]

データの検査対象となる、 reftable の 1 つ以上の列。 これが指定されなかった場合、 reftable の PRIMARY KEY が使用されます。

MATCH matchtype

MATCH FULL、MATCH PARTIAL、及び、何も指定がない場合の デフォルトの一致方法という 3 種類の一致方法があります。 MATCH FULL の場合、複数列からなる外部キーの 1 つの列 は、全ての外部キーの列が NULL でない限り、NULL を持つことができません。 デフォルトの一致方法の場合、外部キーの他の部分が 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 は、2 つの値を取ることができます。

IMMEDIATE

各文の実行終了後、制約を検査します。 これがデフォルトです。

DEFERRED

トランザクションの終了時にのみ制約を検査します。

出力

status

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

このエラーは、被参照テーブルに一致する列が存在しな い値を列に挿入しようとした、その実行時に起こります。

説明

FOREIGN KEY 制約は、1 つ以上の別々の列からなるグルー プが被参照テーブルの別々の列からなるグループと関係を もつという、ルールを指定します。

FOREIGN KEY テーブル制約は列制約における 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(03) PRIMARY KEY DEFAULT NEXTVAL('serial'),
     name     VARCHAR(40) NOT NULL CHECK (name <> '')
);
   

2 次元配列をもつテーブルを作成します。

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

films テーブルに UNIQUE テーブル制約を定義します。

CREATE TABLE films (
    code      CHAR(5),
    title     VARCHAR(40),
    did       DECIMAL(03),
    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 テーブル制約は、そのテーブルの 1 つ以上の列に 対して定義することができます。

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

distributors テーブルに PRIMARY KEY 列制約を定義します。 PRIMARY KEY 列制約はそのテーブルの 1 つの列に対 してのみ定義することができます。 (次の 2 つは同じ意味を持ちます。)

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

注意

CREATE TABLE/INHERITS は Postgres の拡張言語です。

互換性

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 句が省略された場合は、デフォルトのオプションである ON COMMIT DELETE ROWS が指定されたものと仮定します。

一時テーブルを作成します。

CREATE TEMPORARY TABLE actors (
    id         DECIMAL(03),
    name       VARCHAR(40),
    CONSTRAINT actor_id CHECK (id < 150)
) ON COMMIT DELETE ROWS;
    

UNIQUE 句

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

テーブル制約定義。

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

列制約定義。

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

NULL 句

NULL "制約"(実際は制約ではありません。) は、 SQL92 に対する Postgres の 拡張で、NOT NULL 句と釣合いを取るために実装されています。 これは全ての列に対するデフォルトですので、この制約は 単に余分なものです。

[ CONSTRAINT name ] NULL 
     

NOT NULL 句

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

[ 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 name ] CHECK constraint 
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]
     

テーブル制約の定義。

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

列制約定義。

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

CONSTRAINT 定義は 1 つの猶予属性句と 1 つの初期制約モード 句の、両方もしくは片方のみを順序に関係なく持つことができ ます。

NOT DEFERRABLE

この制約は各行の実行終了時に検査される必要があります。 SET CONSTRAINTS ALL DEFERRED はこの種の制約には何も 効果を及ぼしません。

DEFERRABLE

これは、その制約の検査をトランザクションの終了まで延期すること ができるかどうかを制御します。 SET CONSTRAINTS ALL DEFERRED が使用された、もしくは、その制約 に INITIALLY DEFERRED が設定された場合、外部キーに対する検査は そのトランザクションの終了時にのみ行なわれます。

SET CONSTRAINT は現在のトランザクションに限定して外部キー制約 モードを変更します。

INITIALLY IMMEDIATE

各文の実行後に制約の検査を行ないます。 これがデフォルトです。 (訳注: IMMEDIATE と DEFERRED の説明を逆にしています。)

INITIALLY DEFERRED

トランザクションの終了時にのみ制約の検査を行ないます。 (訳注: IMMEDIATE と DEFERRED の説明を逆にしています。)

CHECK 句

SQL92 はCHECK テーブル制約、及び、CHECK 列制約にい くつかの追加的機能を規定しています。

テーブル制約定義。

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

列制約定義。

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

ドメイン制約定義。

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

CHECK ドメイン制約は、CREATE DOMAIN 文、または、 ALTER DOMAIN 文で定義できます。

CREATE DOMAIN duration AS SMALLINT 
    CONSTRAINT minutes CHECK (VALUE IN (90,120,180,240)); 

ALTER DOMAIN cities 
    ADD CONSTRAINT new_city CHECK (VALUE LIKE 'L%');
   

PRIMARY KEY 句

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

テーブル制約定義。

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

列制約定義。

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