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 [, ...] ) ]
このセッションに対してのみテーブルが作成され、セッション 終了と同時に自動的に削除されます。 同じ名前で存在している恒久的なテーブルは暫定的テーブルが 存在している間は非可視です。
作成される新しいテーブルの名前です。
カラムの名前です。
カラムの型です。配列の指定を含むこともあります。 データ型と配列についてより詳しくは PostgreSQL ユーザガイド を 参照して下さい。
カラムのデフォルト値です。 より詳しくは DEFAULT 句を参照して下さい。
オプションのカラム制約条件句は、新規または更新された項目が、 挿入または更新の操作がうまく行なわれるために満足しなければ ならない、完全性保証制約条件、あるい一連の評価の明細を指定 します。それぞれの制約条件はブール式を評価しなければなりません。 SQL92 ではそのカラムだけを参照する column_constraint_clause を必要としますが、Postgres では一つの カラム制約条件で複数のカラムを参照して構いません。 詳しい情報はカラム CONSTRAINT 句を参照して下さい。
オプションのテーブル CONSTRAINT 句は、新規または更新された項目が、 挿入または更新の操作がうまく行なわれるために満足しなければ ならない、完全性制約条件の明細を指定します。 それぞれの制約条件はブール式を評価しなければなりません。 一つの制約条件の中で複数のカラムが参照されても構いません。 テーブルに対して、PRIMARY KEY 句は一つだけ指定することが 出来ます。 PRIMARY KEY column (テーブルの制約) と PRIMARY KEY (カラムの制約)は基本的に排他的です。 より詳しくは、テーブル CONSTRAINT 句を参照して下さい。
オプションの INHERITS 句は、全てのフィールドをそのテーブルから 自動的に継承するテーブル名の集合を指定します。 継承されたフィールド名が1つ以上あるときには、 Postgres はエラーを出します。 Postgres は、継承の階層の 中でその上位にあるテーブル上の継承関数を作成されたテーブルが 継承することを無条件で認めています。
余談: 関数の継承は Common Lisp Object System (CLOS) の 取り決めに従って行われます。
CREATE TABLE は指定したデータベースの 中に新しいテーブルを挿入します。 テーブルはこのコマンドを発行したユーザの"所有"となります。
新しいテーブルは初期データのない堆積(ヒープ)として作成 されます。テーブルには 1600 以上のカラムを作れません。 (実際は、タプルの大きさが 8192 バイト以下に制限されて いるという事実によります。)しかしサイトによってはより 少なく設定されている所もあるでしょう。テーブルはシステム カタログと同じ名前を持つことは出来ません。
DEFAULT value
DEFAULT 句は (CREATE TABLE 文のカラム定義経由)カラムに デフォルトのデータ値を割り当てます。 デフォルト値のデータ型はカラム定義のデータ型に一致しなければ なりません。
指定したデフォルト値の無いカラムのあるテーブルに対する INSERT 操作は、明示的にそのデータ値が与えられていない限り そのカラムに NULL 値を割り当てます。 デフォルトの literal は、デフォルトが指定された定数値であることを意味します。 デフォルトの niladic-function または user-function は デフォルトが INSERT 時における指定された関数の値であることを 意味します。
ニラディック関数には二つの型があります。
CURRENT_USER 関数を参照して下さい。
まだサポートされていません。
まだサポートされていません。
CURRENT_DATE 関数を参照して下さい。
CURRENT_TIME 関数を参照して下さい。
CURRENT_TIMESTAMP 関数を参照して下さい。
現在のリリース (v6.5) の Postgres は、 テーブル定義の時に全てのデフォルト式を評価します。 ですから、 CURRENT_TIMESTAMP のような"キャッシュ できない"関数は期待するような効果をもたらさないことがあります。 date/time 型の特別な場合についての、この振舞を以下のようにして確かめ ることが出来ます。 "DEFAULT 'now'" または "DEFAULT CURRENT_TIMESTAMP" の代わりとして、 "DEFAULT TEXT 'now'" を使います。 これにより、Postgres は実行時に 定数を文字型と判断し、その値を timestamp に変換 するようになります。
定数値をカラム did と number のデフォルトとして割り当て、リテラル文字列をカラム 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 } [, ...]
完全性保証制約条件に与えられる任意の名前です。 name が 指定されていない場合、それはテーブル名とカラム名から 生成され、その name の一意性は保証されます。
カラムには NULL 値があっても構いません。そしてこれはデフォルトです。
カラムに NULL 値があってはいけません。 これはカラム制約 CHECK (column NOT NULL) と等価です。
カラムに一意の値がなければなりません。 Postgres では、テーブル上に UNIQUE インデックスを明示的に作成することで、適用されます。
このカラムは主キーで、システムにより一意性が適用されて、 他のテーブルが、このカラムを行に対する一意な識別子として参照 することが出来るようになります。 より詳しくは PRIMARY KEY を参照して下さい。
制約条件の定義です。
制約条件とは、名前の付いているルールで、 基本テーブル上で実行された INSERT、UPDATE または DELETE 操作 の結果に制限を加えることによって有効な値の一群の定義を手助け する SQL オブジェクトです。
完全性保証制約条件を定義する方法は、後で述べるテーブル制約条件と、 ここで述べるカラム制約条件の二つがあります。
カラム制約条件はカラム定義の一部として定義される、 データの完全性を保証する制約条件で、理論上、作成された時点で テーブル制約条件となります。カラム制約条件として有効なものは 以下のものです:
PRIMARY KEY |
REFERENCES |
UNIQUE |
CHECK |
NOT NULL |
Note: Postgres は(リリース 6.5) の 時点でまだ REFERENCES の完全性を保証する制約条件をサポート していません。パーサは REFERENCES の構文を受け付けるとは いっても、その句を無視します。
[ CONSTRAINT name ] NOT NULL
NOT NULL 制約条件は、カラムが 非 NULL 値のみというルールを 指定します。これは、カラム制約条件のみに対するものであって、 テーブル制約条件としては認められていません。
[ CONSTRAINT name ] UNIQUE
一つのカラムに重複した値を挿入しようとした時の 実行時に出力されるエラーです。
UNIQUE 制約条件は、テーブルの一つ以上の独立したそれぞれの カラムのグループが一意の値しか持つことが出来ないてないとい うルールを指定します。
指定されたカラムのカラム定義は、UNIQUE 制約条件に含まれる NOT NULL 制約条件を持ってはなりません。NOT NULL 制約条件 のないカラムに一つ以上の NULL 値があっても UNIQUE 制約条件 に違反しません。(このことは SQL92 定義 から逸脱しますが、より意味のある取り決めです。より詳細は 互換性の節を参照して下さい。
それぞれの UNIQUE カラム制約条件は、そのテーブルに対して 指名された他のいかなる UNIQUE または PRIMARY KEY 制約条件 によって指名されたカラムの一群と異なるカラムを指名しな ければなりません。
Note: データの完全性を保証するため、Postgres はそれぞれの UNIQUE 制約条件に対して自動的に一意の インデックスを作成します。 より詳しくは、CREATE INDEX を参照して下さい。
[ CONSTRAINT name ] CHECK ( condition [, ...] )
[ CONSTRAINT name ] PRIMARY KEY
実行時に重複した値が、 PRIMARY KEY 制約条件となるカラムに 挿入されようとしたときに出力されるエラーです。
[ CONSTRAINT name ] { PRIMARY KEY | UNIQUE } ( column [, ...] ) [ CONSTRAINT name ] CHECK ( constraint )
完全性保証制約条件に与えられる任意の名前です。
一意のインデックス、 PRIMARY KEY、NOT NULL 制約条件 を定義するカラム(複数可)の名前です。
制約条件として評価されるブール式です。
テーブル制約条件は、基本テーブルの一つ以上の カラムに定義されたデータの完全性を保証する制約条件です。 "テーブル制約条件"には次の四つがあります。
UNIQUE |
CHECK |
PRIMARY KEY |
FOREIGN KEY |
Note: Postgres は (6.5 の段階で)まだ FOREIGN KEY 完全性保証制約条件をサポートしていません。 パーサは FOREIGN KEY の構文を理解はしますが、警告を表示 するかその句を無視するかいずれかです。 外部キーはトリガによって一部エミュレートされることが あります。(CREATE TRIGGER 文を参照して下さい。)
[ CONSTRAINT name ] UNIQUE ( column [, ...] )
実行時に、ひとつのカラムに重複した値を挿入しようと した場合に出力されるエラーです。
テーブル 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) );
ローカルに可視的な暫定テーブルに加え、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;
SQL92 は UNIQUE にいくつかの追加的機能を明記しています。
テーブル制約条件の定義:
[ CONSTRAINT name ] UNIQUE ( column [, ...] ) [ { INITIALLY DEFERRED | INITIALLY IMMEDIATE } ] [ [ NOT ] DEFERRABLE ]
カラム制約条件の定義:
[ CONSTRAINT name ] UNIQUE [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ]
NULL "制約条件"(実際には制約条件では有りませんが)は、 SQL92 に対する Postgres の 拡張で、NOT NULL 句と対象的に実装されています。 どのカラムに対してもデフォルトであるため、この "制約条件"は単に余分なものです。
[ CONSTRAINT name ] NULL
SQL92 は NOT NULL にいくつかの追加的機能を明記しています。
[ CONSTRAINT name ] NOT NULL [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ]
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 定義は一つの猶予属性句そして/または一つの初期 制約条件モード句を順序に関係なく含むことが出来ます。
の意味は、それぞれの SQL 文が実行された後、ルールに 違反していないかどうかチェックされなければならない と言うことです。
の意味は、制約条件のチェックが指定されたトランザクション が終了する前までであれば、後まで猶予しても構わないと言う ことです。
それぞれの制約条件に対する制約モードは、トランザクションが 開始した時点でその制約条件に対して設定されるデフォルトの初期値 を常に所有しています。
の意味は、トランザクション開始時点で、それぞれの SQL 文 が実行された後、ルールに違反していないかどうかチェック されなければならいと言うことです。
の意味は、トランザクション開始時点で、制約条件のチェックが 指定されたトランザクションが終了する前までであれば、後に延期さ れても構わないと言うことです。
SQL92 はテーブルまたはカラム制約条件の CHECK に いくつかの追加的機能を明記しています。
テーブル制約条件の定義:
[ CONSTRAINT name ] CHECK ( VALUE condition ) [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ]
カラム制約条件の定義:
[ CONSTRAINT name ] CHECK ( VALUE condition ) [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ]
SQL92 は PRIMARY KEY にいくつかの追加的機能を明記しています。
テーブル制約条件の定義:
[ CONSTRAINT name ] PRIMARY KEY ( column [, ...] ) [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ]
カラム制約条件の定義:
[ CONSTRAINT name ] PRIMARY KEY [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ]