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 では、1 つの列制約内 で複数の列を参照することができます。 より詳しくは列制約句を参照して下さい。
オプションのテーブル制約句は、挿入/更新操作が正常に行なわれる ために、新規/更新項目が満たさなければならない、整合性 制約のリストを指定します。 各制約はブール式で評価されなければなりません。 1 つの制約内で複数の列を参照することができます。 1 つのテーブルに対し、1 つだけ PRIMARY KEY 句を指定することが できます。 PRIMARY KEY column (テーブル制約) と PRIMARY KEY (列制約) は互いに排他的です。 より詳しくは テーブル制約句を参照して下さい。
オプションの INHERITS 句は、このテーブルが自動的に全て のフィールドを継承する、テーブル名の集合を指定します。 継承されたフィールド名に重複があった場合、 Postgres はエラーを報告します。 Postgres では自動的に、作成された テーブルは継承階層でその上位にあるテーブルの関数を継承するこ とができます。
CREATE TABLE は現在のデータベースにクラス、 もしくは、テーブルを新規に登録します。 テーブルはこのコマンドを発行したユーザによって "所有" されます。
各 type は、単純な型、複雑な型(セット)、もしくは、配列型をとることが できます。 各属性は、 DEFAULT 句 を使用して、NULL を持たないように指定することも、デフォルト 値を持つように指定することもできます。
Note: Postgres バージョン 6.0 以降、属性内の配列次元数に対する制約 は強制されていません。 これは将来のリリースでは変更する予定です。
オプションの INHERITS 句は、このテーブルが自動的に全てのフィー ルドを継承する、テーブル名の集合を指定します。 継承されたフィールド名に重複があった場合、Postgres はエラーを 報告します。 Postgres では自動的に、作成された テーブルは継承階層でその上位にあるテーブルの関数を継承するこ とができます。 関数の継承は Common Lisp オブジェクトシステム(CLOS)の慣習に 従って行なわれます。
新しい、table テーブル/ クラスは、それぞれ、自動的に型として作成されます。 そのため、そのクラスからの 1 つ以上のインスタンスは自動的に型になり、 ALTER TABLE や別の CREATE TABLE 文で使用することができます。
新しいテーブルは、初期データを持たないヒープとして作成されます。 テーブルには 1600 以上の列を持たせることはできません。 (これは実際には、 タプルサイズは8192 バイト未満でなければなら ないことによる制限です。) しかし、この制限はサイトによっては、もっと少なく設定されてい るかもしれません。
DEFAULT value
DEFAULT 句は (CREATE TABLE 文内の列定義経由で) 列にデ フォルト値を代入します。 デフォルト値のデータ型は列定義におけるデータ型に一致しな ければなりません。
対象にデフォルト値の指定のない列を含む INSERT 操作は、 明示的なデータ値が与えられていなければ、その列に NULL 値を代入します。 デフォルトの literal は、指定した定数値がそのデフォルトとなることを意味します。 デフォルトの niladic-function 、及び、 user-function は、INSERT 実行時点における指定した関数の結果がそのデフォ ルトになることを意味します。
次の 2 種類のニラディック関数があります。
CURRENT_USER 関数を参照して下さい。
SESSION_USER 関数を参照して下さい。 (訳注: CURRENT_USER → SESSION_USER として訳。)
未実装。
CURRENT_DATE 関数を参照して下さい。
CURRENT_TIME 関数を参照して下さい。
CURRENT_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 | REFERENCES reftable (refcolumn) [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] [ [ NOT ] DEFERRABLE ] [ INITIALLY checktime ] } [, ...]
この整合性制約に付与する任意の名前。 name の指定がない場合、 name が確実に一意になるように、テーブル名と列名から名 前が生成されます。
この列は NULL 値を持つことができます。 これはデフォルトです。
この列は NULL 値を持つことができません。 これは、 CHECK (column NOT NULL) という列制約と同一です。
列は一意な値を持たなければなりません。 Postgres では、これはそのテー ブルに暗黙的に作成される一意インデックスによって行なわ れます。
この列はプライマリキーです。つまり、システムによって 一意性が維持され、他のテーブルから行の一意な識別子として この列が参照可能であることを意味します。 より詳しくは、PRIMARY KEY を参照して下さい。
制約の定義。
オプションの列制約句は、挿入/更新操作が正常に行なわれる ために、新規/更新項目が満たさなければならない、整合 性制約、もしくは検査事項のリストを指定します。 各制約はブール式で評価されなければなりません。 1 つの列制約内で複数の列を参照することができます。 テーブル制約としての PRIMARY KEY の使用と列制約としての PRIMARY KEY の使用は互いに非互換です。
制約とは、 SQL オブジェクトである、名前付きのルールです。 この SQL オブジェクトは、ベーステーブルに対する INSERT、 UPDATE、及び、DELETE 操作結果に対して制限を付与すること によって、有効な値集合の定義を補助します。
整合性制約を定義する方法には 2 つの方法があります。 後述の、テーブル制約とここで説明する、列制約です。
列制約は列定義の一部分として定義される整合性 制約であり、論理的には、生成された時点でテーブル制約に なります。 列制約には、次のものが使用できます。
PRIMARY KEY |
REFERENCES |
UNIQUE |
CHECK |
NOT NULL |
[ CONSTRAINT name ] NOT NULL
NOT NULL 制約は、列は非 NULL 値のみを持つことがで きるというルールを指定します。 これは、列制約のみであり、テーブル制約としては使用 できません。
[ CONSTRAINT name ] UNIQUE
このエラーは、列に重複する値を挿入しようとした、 その実行時に起こります。
UNIQUE 制約は、あるテーブル内にある 1 つ以上の別々の列から なるグループが一意な値のみを持つことができるというルールを指 定します。
1 つの UNIQUE 制約に含めるように指定される列の 列定義では、NOT NULL 制約を含める必要はありません。 列に NOT NULL 制約がない場合に 1 つ以上の NULL 値 を持つことは、UNIQUE 制約に違反しません。 (これは、SQL92 定義から逸脱していま すが、より意味のある規約です。より詳細については互換性 の節を参照して下さい。)
各 UNIQUE 列制約は、そのテーブルで定義された他の全ての UNIQUE または PRIMARY KEY 制約で指名された列群とは異な る列を指名しなければなりません。
Note: Postgres は、データの整合性を 保証するために、各 UNIQUE 制約に対して一意インデック スを自動的に作成します。 より詳しくは CREATE INDEX を参照して下さい。
[ CONSTRAINT name ] CHECK ( condition [, ...] )
[ CONSTRAINT name ] PRIMARY KEY
これは、PRIMARY KEY 制約に従う列に重複する値を挿入し ようとした、その実行時に起こります。
[ 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 FULL、MATCH PARTIAL、及び、何も指定がない場合の デフォルトの一致方法という 3 種類の一致方法があります。 MATCH FULL の場合、複数列からなる外部キーの 1 つの列 は、全ての外部キーの列が NULL でない限り、NULL を持つことができません。 (訳注: つまり全てが NULL 値になる場合を除いて、NULL 値を持つことができません。) デフォルトの一致方法の場合、外部キーの他の部分が NULL でなけ れば、複数列からなる外部キーのいくつかの列は NULL を持つことができます。 (訳注: つまり一部分がNULL値を持つことができます。) MATCH PARTIAL は現在サポートされていません。
被参照テーブルの被参照行が削除された時の動作。 次の動作を指定できます。
外部キー違反の場合、エラーになります。 これがデフォルトです。
NO ACTION と同一です。
削除された行を参照する全ての行を削除します。
参照する列の値を NULL に設定します。
参照する列の値をそのデフォルト値に設定します。
被参照テーブルの被参照列が新しい値に更新された時の動作。 行が更新されたが、被参照列に変更がなかった場合は、何も 動作しません。 次の動作を指定できます。
外部キー違反の場合エラーになります。 これがデフォルトです。
NO ACTION と同一です。
参照する列の値を、被参照列の新しい値に更新します。
参照する列の値を NULL に設定します。
参照する列の値をそのデフォルト値に設定します。
これは、その制約の検査をトランザクションの終了まで延期すること ができるかどうかを制御します。 DEFERRABLE の場合、SET CONSTRAINTS ALL DEFERRED によって、外部 キーに対する検査はそのトランザクションの終了時にのみ行なわれま す。 NOT DEFERRABLE がデフォルトです。
制約の検査を実行するデフォルトのタイミングを指定する、 checktime は、2 つの値を取ることができます。
トランザクションの終了時にのみ制約を検査します。
各文の実行終了後、制約を検査します。 これがデフォルトです。
このエラーは、被参照テーブルに一致する列が存在しな い値を列に挿入しようとした、その実行時に起こります。
[ 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 制約を定義す る、列名(複数可)。
制約として評価されるブール式。
テーブル制約はベーステーブルの複数の列に対して定義された 整合性制約です。 "テーブル制約" には、次の 4 種類があります。
UNIQUE |
CHECK |
PRIMARY KEY |
FOREIGN KEY |
[ CONSTRAINT name ] UNIQUE ( column [, ...] )
このエラーは、列に重複する値を挿入しようとした、 その実行時に起こります。
[ CONSTRAINT name ] PRIMARY KEY ( column [, ...] )
[ CONSTRAINT name ] FOREIGN KEY ( column [, ...] ) REFERENCES reftable [ ( refcolumn [, ...] ) ] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] [ [ NOT ] DEFERRABLE ] [ INITIALLY checktime ]
REFERENCES 制約は、列値が他の列の値に対して検査 されるというルールを指定します。 REFERENCES はまた、FOREIGN KEY テーブル制約の一部として 指定することもできます。
制約に対する任意の名前。
このテーブル内の 1 つ以上の列名。
検査対象とするデータを持つテーブル。
データの検査対象となる、 reftable の 1 つ以上の列。 これが指定されなかった場合、 reftable の PRIMARY KEY が使用されます。
MATCH FULL、MATCH PARTIAL、及び、何も指定がない場合の デフォルトの一致方法という 3 種類の一致方法があります。 MATCH FULL の場合、複数列からなる外部キーの 1 つの列 は、全ての外部キーの列が NULL でない限り、NULL を持つことができません。 デフォルトの一致方法の場合、外部キーの他の部分が NULL でなけ れば、複数列からなる外部キーのいくつかの列は NULL を持つことができます。 MATCH PARTIAL は現在サポートされていません。
被参照テーブルの被参照行が削除された時の動作。 次の動作を指定できます。
外部キー違反の場合、エラーになります。 これがデフォルトです。
NO ACTION と同一です。
削除された行を参照する全ての行を削除します。
参照する列の値を NULL に設定します。
参照する列の値をそのデフォルト値に設定します。
被参照テーブルの被参照列が新しい値に更新された時の動作。 行が更新されたが、被参照列に変更がなかった場合は、何も 動作しません。 次の動作を指定できます。
外部キー違反の場合エラーになります。 これがデフォルトです。
被参照行に対する更新を許しません。
参照する列の値を、被参照列の新しい値に更新します。
参照する列の値を NULL に設定します。
参照する列の値をそのデフォルト値に設定します。
これは、その制約の検査をトランザクションの終了まで延期すること ができるかどうかを制御します。 DEFERRABLE の場合、SET CONSTRAINTS ALL DEFERRED によって、外部 キーに対する検査はそのトランザクションの終了時にのみ行なわれま す。 NOT DEFERRABLE がデフォルトです。
制約の検査を実行するデフォルトのタイミングを指定する、 checktime は、2 つの値を取ることができます。
各文の実行終了後、制約を検査します。 これがデフォルトです。
トランザクションの終了時にのみ制約を検査します。
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) );
ローカルに可視的な一時テーブルに加え、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 は制約にいくつかの追加的機能を規定しています。また、 主張、及び、ドメイン制約も定義しています。
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 つの初期制約モード 句の、両方もしくは片方のみを順序に関係なく持つことができ ます。
この制約は各行の実行終了時に検査される必要があります。 SET CONSTRAINTS ALL DEFERRED はこの種の制約には何も 効果を及ぼしません。
これは、その制約の検査をトランザクションの終了まで延期すること ができるかどうかを制御します。 SET CONSTRAINTS ALL DEFERRED が使用された、もしくは、その制約 に INITIALLY DEFERRED が設定された場合、外部キーに対する検査は そのトランザクションの終了時にのみ行なわれます。
SET CONSTRAINT は現在のトランザクションに限定して外部キー制約 モードを変更します。
各文の実行後に制約の検査を行ないます。 これがデフォルトです。 (訳注: IMMEDIATE と DEFERRED の説明を逆にしています。)
トランザクションの終了時にのみ制約の検査を行ないます。 (訳注: IMMEDIATE と DEFERRED の説明を逆にしています。)
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%');