他のバージョンの文書 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

5.3. 識別列 #

識別列は暗黙的なシーケンスにより自動的に生成される特殊な列です。 これはキー値の生成に使用できます。

識別列を作成するには、CREATE TABLEGENERATED ... AS IDENTITY句を使用します。 例を示します。

CREATE TABLE people (
    id bigint GENERATED ALWAYS AS IDENTITY,
    ...,
);

あるいは

CREATE TABLE people (
    id bigint GENERATED BY DEFAULT AS IDENTITY,
    ...,
);

詳細はCREATE TABLEを参照してください。

INSERTコマンドが識別列を持つテーブルで実行され、識別列に値が明示的に指定されていない場合、暗黙的なシーケンスによって生成された値が挿入されます。 例えば、上記の定義を使用し、追加の適切な列を想定して、次のように記述すると、

INSERT INTO people (name, address) VALUE ('A', 'foo');
INSERT INTO people (name, address) VALUE ('B', 'bar');

1から始まるid列の値を生成し、結果は次のテーブルデータになります。

 id | name | address
----+------+---------
  1 | A    | foo
  2 | B    | bar

あるいは、値の代わりにキーワードDEFAULTを指定して、以下のようにシーケンスによって生成された値を明示的に要求することもできます。

INSERT INTO people (id, name, address) VALUE (DEFAULT, 'C', 'baz');

同様に、キーワードDEFAULTUPDATEコマンドでも使用できます。

したがって、多くの点で、識別列はデフォルト値のある列のように動作します。

識別列の定義のALWAYSおよびBY DEFAULT句は、INSERTおよびUPDATEコマンドでユーザが明示的に指定した値をどのように処理するかを決定します。 INSERTコマンドでは、ALWAYSが選択されている場合、INSERTOVERRIDING SYSTEM VALUEを指定している場合にのみ、ユーザ指定の値が受け入れられます。 BY DEFAULTを選択すると、ユーザ指定の値が優先されます。 したがって、BY DEFAULTを使用すると、明示的な値によって上書きできるという、デフォルト値により似た動作になります。 一方、ALWAYSでは、誤って明示的な値を挿入することに対する保護が強化されます。

識別列のデータ型は、シーケンスでサポートされているデータ型の1つである必要があります。(CREATE SEQUENCEを参照。) 関連付けられたシーケンスの属性は、識別列の作成時に指定するか(CREATE TABLEを参照)、後で変更できます(ALTER TABLEを参照)。

識別列は自動的にNOT NULLとマークされます。 ただし、識別列は一意性を保証しません。 (通常、シーケンスは一意な値を戻しますが、シーケンスはリセットにするか、前述のように識別列に値を手動で挿入できます。) 一意性を強制するには、PRIMARY KEYまたはUNIQUE制約を使用する必要があります。

テーブル継承階層では、子テーブルの識別列とその属性は、親テーブルの識別列とその属性から独立しています。 子テーブルは、親から自動的に識別列またはその属性を継承しません。 INSERTまたはUPDATEのときにSQL文で書かれたテーブルの列が識別列である場合、その列は識別列として扱われ、対応する識別列の属性が適用されます。

パーティションは、パーティションテーブルから識別列を継承します。 各パーティションが独自の識別列を持つことはできません。 識別列の属性はパーティション階層内のすべてのパーティションで一貫しています。