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 では一つの カラム制約条件で複数のカラムを参照して構いません。 詳しい情報はカラム CONSTRAINT 句を参照して下さい。

table_constraint_clause

オプションのテーブル CONSTRAINT 句は、新規または更新された項目が、 挿入または更新の操作がうまく行なわれるために満足しなければ ならない、完全性制約条件の明細を指定します。 それぞれの制約条件はブール式を評価しなければなりません。 一つの制約条件の中で複数のカラムが参照されても構いません。 テーブルに対して、PRIMARY KEY 句は一つだけ指定することが 出来ます。 PRIMARY KEY column (テーブルの制約) と PRIMARY KEY (カラムの制約)は基本的に排他的です。 より詳しくは、テーブル CONSTRAINT 句を参照して下さい。

INHERITS inherited_table

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

余談: 関数の継承は Common Lisp Object System (CLOS) の 取り決めに従って行われます。

出力

CREATE

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

ERROR

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

ERROR: DEFAULT: type mismatched

カラム定義のデータ型とデフォルト値のデータ型が 一致しない場合です。

説明

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

新しいテーブルは初期データのない堆積(ヒープ)として作成 されます。テーブルには 1600 以上のカラムを作れません。 (実際は、タプルの大きさが 8192 バイト以下に制限されて いるという事実によります。)しかしサイトによってはより 少なく設定されている所もあるでしょう。テーブルはシステム カタログと同じ名前を持つことは出来ません。

DEFAULT 句

DEFAULT value
   

入力

value

デフォルト値の式に対して、有効な値は以下のものです。

  • リテラル値

  • ユーザ関数

  • ニラディック(無引数の)関数

出力

ありません。

説明

DEFAULT 句は (CREATE TABLE 文のカラム定義経由)カラムに デフォルトのデータ値を割り当てます。 デフォルト値のデータ型はカラム定義のデータ型に一致しなければ なりません。

指定したデフォルト値の無いカラムのあるテーブルに対する INSERT 操作は、明示的にそのデータ値が与えられていない限り そのカラムに NULL 値を割り当てます。 デフォルトの literal は、デフォルトが指定された定数値であることを意味します。 デフォルトの niladic-function または user-function は デフォルトが INSERT 時における指定された関数の値であることを 意味します。

ニラディック関数には二つの型があります。

ニラディック USER

CURRENT_USER / USER

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

SESSION_USER

まだサポートされていません。

SYSTEM_USER

まだサポートされていません。

ニラディック datetime

CURRENT_DATE

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

CURRENT_TIME

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

CURRENT_TIMESTAMP

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

現在のリリース (v6.5) の Postgres は、 テーブル定義の時に全てのデフォルト式を評価します。 ですから、 CURRENT_TIMESTAMP のような"キャッシュ できない"関数は期待するような効果をもたらさないことがあります。 date/time 型の特別な場合についての、この振舞を以下のようにして確かめ ることが出来ます。 "DEFAULT 'now'" または "DEFAULT CURRENT_TIMESTAMP" の代わりとして、 "DEFAULT TEXT 'now'" を使います。 これにより、Postgres は実行時に 定数を文字型と判断し、その値を 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 句

[ CONSTRAINT name ] { [
    NULL | NOT NULL ] | UNIQUE | PRIMARY KEY | CHECK constraint } [, ...]
   

入力

name

完全性保証制約条件に与えられる任意の名前です。 name が 指定されていない場合、それはテーブル名とカラム名から 生成され、その name の一意性は保証されます。

NULL

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

NOT NULL

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

UNIQUE

カラムに一意の値がなければなりません。 Postgres では、テーブル上に UNIQUE インデックスを明示的に作成することで、適用されます。

PRIMARY KEY

このカラムは主キーで、システムにより一意性が適用されて、 他のテーブルが、このカラムを行に対する一意な識別子として参照 することが出来るようになります。 より詳しくは PRIMARY KEY を参照して下さい。

constraint

制約条件の定義です。

説明

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

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

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

PRIMARY KEY
REFERENCES
UNIQUE
CHECK
NOT NULL

Note: Postgres は(リリース 6.5) の 時点でまだ REFERENCES の完全性を保証する制約条件をサポート していません。パーサは REFERENCES の構文を受け付けるとは いっても、その句を無視します。

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 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 を参照して下さい。

使用法

テーブル distributors に対し UNIQUE カラム制約条件を定義します。 UNIQUE カラム制約条件はテーブルの一つのカラムに対してのみ 定義可能です:

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 カラム制約条件はテーブルの一つのカラム に対してのみ定義され、そのカラムを参照します。 Postgres にはこの制約がありません。

PRIMARY KEY 制約条件

[ CONSTRAINT name ] PRIMARY KEY 
   

入力

CONSTRAINT name

その制約条件に対する任意の名前です。

Outputs

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 は特別に このことを認めていないわけではありません。

テーブル CONSTRAINT 句

[ CONSTRAINT name ] { PRIMARY KEY |  UNIQUE } ( column [, ...] )
[ CONSTRAINT name ] CHECK ( constraint )
   

入力

CONSTRAINT name

完全性保証制約条件に与えられる任意の名前です。

column [, ...]

一意のインデックス、 PRIMARY KEY、NOT NULL 制約条件 を定義するカラム(複数可)の名前です。

CHECK ( constraint )

制約条件として評価されるブール式です。

出力

テーブル制約条件句に対して、可能性のある出力は、カラム制約条件での 対応する部分によって出力と同一です。

説明

テーブル制約条件は、基本テーブルの一つ以上の カラムに定義されたデータの完全性を保証する制約条件です。 "テーブル制約条件"には次の四つがあります。

UNIQUE
CHECK
PRIMARY KEY
FOREIGN KEY

Note: Postgres は (6.5 の段階で)まだ FOREIGN KEY 完全性保証制約条件をサポートしていません。 パーサは FOREIGN KEY の構文を理解はしますが、警告を表示 するかその句を無視するかいずれかです。 外部キーはトリガによって一部エミュレートされることが あります。(CREATE TRIGGER 文を参照して下さい。)

UNIQUE 制約条件

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

入力

CONSTRAINT name

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

column

テーブル内のカラムの名前です。

出力

status

ERROR: Cannot insert a duplicate key into a unique index

実行時に、ひとつのカラムに重複した値を挿入しようと した場合に出力されるエラーです。

説明

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 [, ...]

テーブル内の一つまたはそれ以上のカラムの名前です。

出力

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 カラム制約条件の節を参照して下さい。

使用法

テーブル 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 <> '')
);
   

二次元配列のテーブルを作成します:

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

テーブル films に UNIQUE テーブル制約条件を定義します。 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 テーブル制約条件はテーブルの一つ以上のカラムに 定義することが出来ます。

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 カラム制約条件はテーブルの一つのカラム に対してのみ定義できます。(以下の二つの例は等価です。)

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 は制約条件にいくつかの追加的機能を明記していて、 主張 (assertion) 制約条件とドメイン制約条件も定義しています。

Note: Postgres は未だ、ドメインも 主張 (assertion) もサポートしていません。

主張 (assertion) は完全性保証制約条件の特殊な形態で、他の制約条件同様 おなじ制約条件グループに属しています。 とはいっても、主張 (assertion) は制約条件がそうであるように一つの特定の 基本テーブルに依存する必要がないため、SQL-92 は制約条件を 定義する別の方法として CREATE ASSERTION 文を用意しています。

CREATE ASSERTION name CHECK ( 条件 )
    

ドメイン制約条件は 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 定義は一つの猶予属性句そして/または一つの初期 制約条件モード句を順序に関係なく含むことが出来ます。

NOT DEFERRABLE

の意味は、それぞれの SQL 文が実行された後、ルールに 違反していないかどうかチェックされなければならない と言うことです。

DEFERRABLE

の意味は、制約条件のチェックが指定されたトランザクション が終了する前までであれば、後まで猶予しても構わないと言う ことです。

それぞれの制約条件に対する制約モードは、トランザクションが 開始した時点でその制約条件に対して設定されるデフォルトの初期値 を常に所有しています。

INITIALLY IMMEDIATE

の意味は、トランザクション開始時点で、それぞれの SQL 文 が実行された後、ルールに違反していないかどうかチェック されなければならいと言うことです。

INITIALLY DEFERRED

の意味は、トランザクション開始時点で、制約条件のチェックが 指定されたトランザクションが終了する前までであれば、後に延期さ れても構わないと言うことです。

CHECK 句

SQL92 はテーブルまたはカラム制約条件の CHECK に いくつかの追加的機能を明記しています。

テーブル制約条件の定義:

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

カラム制約条件の定義:

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

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 ]