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 ] }
指定されると、このセッションに対してのみテーブルが作成され、 セッション終了と同時に自動的に削除されます。 同じ名前で存在し ている永続的なテーブルは一時的テーブルが 存在している間は非可視で す。一時テーブル上に作られる全てのインデックスは自動的に 一時のものになります。
作成される新しいテーブルの名前です。
新しいテーブルに作られる列の名前です。
カラムの型です。配列の指定を含むこともあります。 データ型と配列についてより詳しくは PostgreSQL ユーザガイド を 参照して下さい。
オプションの INHERITS 句は、全てのフィールドをそのテーブルから 自動的に継承するテーブル名の集合を指定します。 継承された フィールド名が 1 つ以上あるときには、 Postgres はエラーを出します。 Postgres は、継承の階層の中でその 上位にあるテーブル上の継承関数を作成されたテーブルが継承する ことを無条件で認めています。
列またはテーブルの制約のオプションの名前です。指定されない 場合はシステムが名前を作ります。
列のデフォルト値です。より詳しくは DEFAULT 句を参照して下さい。
CHECK 句は完全性保証制約を指定する、もしくは挿入か更新の操作が成功する ためにはどの新しいまたは更新された行を満たす必要があるかを テストします。それぞれの制約はブーリアンの結果を作る式で なければいけません。列定義の中に現れる条件は、その列の値のみを 参照するべきですが、テーブル制約として現れる条件は複数の列 であっても構いません。
外部キー制約に参照される既存テーブルの名前です。
外部キー制約に参照される既存テーブル中の列の名前です。 指定されない場合、既存テーブルの主キーが想定されます。
外部キー制約が違反された時にとる動作を示すキーワードです。
CREATE TABLE は指定したデータベースの中に新しく最初は 空であるテーブルを挿入します。 テーブルはこのコマン ドを発行したユーザの"所有"となります。
それぞれの type は単純な型、複雑な型(集合)、または配列型を指定することが できます。それぞれの属性は非 null に指定することができ、 DEFAULT 句 に指定されたデフォルト値を持つことができます。
Note: 属性内で矛盾のない配列次元は強制されていません。 将来のリリースではおそらく変わるでしょう。
CREATE TABLE はさらに、自動的にテーブルの 一行に対応するタプル型(構造の型)を表すデータ型を作成します。 したがって、テーブルはどの既存のデータ型とも同じ名前をもつことは できません。
オプションの INHERITS 句は、このテーブルが自動的に全てのフィールド を継承するテーブル名の集合を指定します。もし継承された フィールド名が一度以上現れる場合、Postgres はエラーを表示shます。 Postgres は作成されたテーブルが継承階層の一つ上のテーブルの 関数を継承することを自動的に許可します。関数の継承は Common Lisp Object System (CLOS) の規約に基づいて 行なわれます。
テーブルは 1600 列以上持つことができません(実践では、 タプル長制約のために効果的な制限は更に低くなります)。 テーブルはシステムカタログテーブルと同じ名前を持つことは できません。
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 ] }
制約句に与えられる任意の名前です。
列には NULL 値があっても構いません。そしてこれはデフォルトです。
列に NULL 値があってはいけません。 これはカラム制約 CHECK ((column NOT NULL) と等価です。
列に一意の値がなければなりません。 Postgres では、列上に UNIQUE インデックスを自動的に作成することで、適用されます。
この列は主キーで、 他のテーブルがこの列を行 に対する一意な識別子として参照することが出来るようになります。 UNIQUE と NOT NULL は両方とも PRIMARY KEY で暗示されます。 さらに詳しい情報は PRIMARY KEY を見て下さい。
任意のブーリアン値を持つ制約条件です。
オプションの制約句は制約を指定するか、あるいはどの新しい又は更新 された行が挿入か更新操作を成功させるのに必要かをテストします。
制約とは、名前の付いているルールで、テーブル上で実行された INSERT、 UPDATE または DELETE 操作の結果に制限を加えることによって有効な値の 一群の定義を手助けする SQL オブジェクトです。
完全性保証制約条件を定義する方法は、後で述べるテーブル制約条件と、 ここで述べる列制約条件の二つがあります。
列制約条件は列定義の一部として定義される、 データの完全性を保証する 制約条件で、理論上、作成された時点でテーブル制約条件となります。 カラム制約条件として有効なものは 以下のものです。
PRIMARY KEY |
REFERENCES |
UNIQUE |
CHECK |
NOT NULL |
[ CONSTRAINT name ] NOT NULL
NOT NULL 制約条件は、カラムが 非 NULL 値のみというルールを 指定します。これは、カラム制約条件のみに対するものであって、 テーブル制約条件としては認められていません。
[ CONSTRAINT constraint_name ] UNIQUE
このエラーは、列に複製の値を挿入しようとした場合に 実行時に起こります。
UNIQUE 制約条件は、テーブルの一つ以上の独立したそれぞれの 列のグループが一意の値しか持つことが出来ないというルールを指定します。
指定されたカラムのカラム定義は、UNIQUE 制約条件に含まれる NOT NULL 制約条件を持ってはなりません。NOT NULL 制約条件 のないカラムに一つ 以上の NULL 値があっても UNIQUE 制約条件 に違反しません。 (このことは SQL92 定義から逸脱しますが、 より意味のある取り決めです。詳細は互換性の節を参照して下さい。)
それぞれの UNIQUE カラム制約条件は、そのテーブルに対して 指名された他のいかなる UNIQUE または PRIMARY KEY 制約条件 によって指名されたカラムの一群と異なるカラムを指名しな ければなりません。
Note: データの完全性を保証するため、Postgres はそれぞれの UNIQUE 制約条件に対して自動的に一意の インデックス を作成します。より詳しくは、CREATE INDEX を参照して下さい。
[ CONSTRAINT constraint_name ] CHECK ( condition )
実行時に違法の値が、CHECK 制約条件となる列に 挿入されようとしたときに出力され るエラーです。
CHECK 制約は列内で有効な値に対しての一般的な制約を指定します。 CHECK 制約条件はテーブル制約条件としても有効です。
CHECK はテーブルの一つ以上の列を含む一般的なブーリアン式 を指定します。そのブーリアン式が行の値に適用されたときに FALSE と評価されると、新しい行は拒絶されます。
現時点では、CHECK 式は副選択を含んだり、現在の行のフィールド 以外の変数を参照することはできません。
SQL92 の標準は CHECK 列制約は適用する列のみを参照できると 言っています。CHECK テーブル制約のみが複数の列を参照することが できます。Postgres はこの制約を 強制しません。列とテーブル CHECK 制約は同等に扱われます。
[ CONSTRAINT constraint_name ] PRIMARY KEY
実行時に重複した値が、PRIMARY KEY 制約条件となる列に 挿入されようとしたときに出力されるエラーです。
[ CONSTRAINT constraint_name ] REFERENCES reftable [ ( refcolumn ) ] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] [ [ NOT ] DEFERRABLE ] [ INITIALLY checktime ]
REFERENCES 制約は列の値が別の列の値とチェックされるルール を指定します。REFERENCES は更に FOREIGN KEY テーブル制約 の一部として指定することもできます。
制約句に与えられる任意の名前です。
チェックをするデータを持つテーブルです。
データをチェックする reftable の列です。これが指定されない場合は、 reftable の PRIMARY KEY が使われます。
MATCH 型には三つあります。MATCH FULL、 MATCH PARTIAL、そして 指定がない場合はデフォルト match 型です。MATCH FULL は、 全ての外部キー列が NULL でない限り複数列の外部キーの一列 が NULL になることを認めません。デフォルトの MATCH 型 は、外部キーの他の部分が NULL ではない間、いくつかの外部キー列が NULL になることを認めます。MATCH PARTIAL は現在のところ サポートされていません。
参照されるテーブルの参照される行が削除されるときに 行なう動作です。下記のものがあります。
外部キーが違反されたときにエラーにします。 これはデフォルトです。
NO ACTION と同じです。
削除された行を参照する任意の行を削除します。
列の参照値を NULL に設定します。
列の参照値をデフォルト値に設定します。
参照されるテーブルの参照される列が新しい値に更新される ときに行なう動作です。もし行が更新され、しかし参照される 列が変わっていない場合、何も動作は起きません。 動作には以下のものがあります。
外部キーが違反された場合エラーにします。 これがデフォルトです。
NO ACTION と同じです。
参照する列の値をその列の新しい値に更新します。
参照する列の値を NULL に設定します。
参照する列の値をデフォルト値に設定します。
これは、制約がトランザクションの終りまで延期できるかどうかを 管理します。 DEFERRABLEの場合、 SET CONSTRAINTS ALL DEFERRED は外部キーがトランザクションの終りでのみチェックするように します。デフォルトは NOT DEFERRABLE です。
checktime は 制約をチェックするデフォルトの時間を指定する二つの 可能な値を持っています。
トランザクションの終りでのみ制約をチェックします。
それぞれの文のあとで制約をチェックします。これが デフォルトです。
このエラーは、参照されるテーブルに照合する列を持たない 列に値を挿入しようとした場合の実行時に起こります。
[ 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 ]
制約句に与えられる任意の名前です。
一意のインデックスを定義する列名で、PRIMARY KEY には NOT NULL 制約です。
制約として評価されるブーリアン式です。
テーブル制約はテーブルの一つ以上の列に定義される 完全性保証制約条件です。"テーブル制約" の四つのバリエーション は以下です。
UNIQUE |
CHECK |
PRIMARY KEY |
FOREIGN KEY |
[ CONSTRAINT constraint_name ] UNIQUE ( column [, ... ] )
実行時に重複した値が挿入されようとしたとき に出力されるエラーです。
[ CONSTRAINT constraint_name ] PRIMARY KEY ( column [, ... ] )
[ CONSTRAINT constraint_name ] FOREIGN KEY ( column [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] [ [ NOT ] DEFERRABLE ] [ INITIALLY checktime ]
REFERENCES 制約は列の値または列の値の集合が別のテーブルの値 とチェックされることを指定します。
制約句に与えられる任意の名前です。
テーブル内の一つ以上の列の名前です。
チェックをするデータを持つテーブルです。
reftable 内でデータをチェックする一つ以上の列です。指定されない 場合、reftable の PRIMARY KEY が使われます。
MATCH 型には三つあります。MATCH FULL、 MATCH PARTIAL、そして 指定がない場合はデフォルト match 型です。MATCH FULL は、 全ての外部キー列が NULL でない限り複数列の外部キーの一列 が NULL になることを認めません。デフォルトの MATCH 型 は、外部キーの他の部分が NULL ではない間、いくつかの外部キー列が NULL になることを認めます。MATCH PARTIAL は現在のところ サポートされていません。
参照されるテーブルの参照される行が削除されるときに行なわれる 動作です。以下の動作があります。
外部キーが違反された場合にエラーを表示します。 これがデフォルトです。
NO ACTION と同じです。
削除された行を参照する行を削除します。
参照する列の値を NULL に設定します。
参照する列の値をデフォルトに設定します。
参照されるテーブルの参照される列が新しい値に更新される ときに行なう動作です。もし行が更新され、しかし参照される 列が変わっていない場合、何も動作は起きません。 動作には以下のものがあります。
外部キーが違反されるとエラーを表示します。 これはデフォルトです。
参照される行の更新を不可能にします。
参照する列の値を参照される列の新しい値に更新します。
参照する列の値を NULL に設定します。
参照する列の値をデフォルト値に設定します。
これは、制約がトランザクションの終りまで延期できるかどうかを 管理します。 DEFERRABLEの場合、 SET CONSTRAINTS ALL DEFERRED は外部キーがトランザクションの終りでのみチェックするように します。デフォルトは NOT DEFERRABLE です。
checktime は 制約をチェックするデフォルトの時間を指定する可能な 値を二つ持っています。
それぞれの文の後で制約をチェックします。これがデフォルト です。
トランザクションの終りのみで制約をチェックします。
テーブル 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 では 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 のようになります。
SQL92 はいくつかの追加機能を UNIQUE に指定しています。
テーブル制約の定義です。
[ CONSTRAINT constraint_name ] UNIQUE ( column [, ... ] ) [ { INITIALLY DEFERRED | INITIALLY IMMEDIATE } ] [ [ NOT ] DEFERRABLE ]
列制約の定義です。
[ CONSTRAINT constraint_name ] UNIQUE [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ]
NULL "制約" (実際は非制約です)は SQL92 の Postgres 拡張で、NOT NULL 句 と対称になっています(そして他のいくつかの RDBMS との 比較用でもあります)。どの列でもこれがデフォルトなので その存在は邪魔なだけです。
[ CONSTRAINT constraint_name ] NULL
SQL92 はいくつかの追加機能を NOT NULL に指定しています。
[ CONSTRAINT constraint_name ] NOT NULL [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ]
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 定義は一つの延期属性句または一つの初期制約モード句 を任意の順番で持つことができます。
制約はそれぞれの文の最後にチェックされなければなりません。 SET CONSTRAINTS ALL DEFERRED はこの制約の型には何の影響 も持ちません。
これは制約がトランザクションの最後まで延期できるかどうかを 管理します。もし SET CONSTRAINTS ALL DEFERRED が使われるか または制約が INITIALLY DEFERRED の場合、外部キーが トランザクションの最後にのみチェックされるようになります。
Note: SET CONSTRAINTS は外部キー制約を 現在のトランザクションのみの適用に変えます。
それぞれの文の後で制約をチェックします。これがデフォルトです。
トランザクションの最後のみで制約をチェックします。
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 ]
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 ]