識別列は暗黙的なシーケンスにより自動的に生成される特殊な列です。 これはキー値の生成に使用できます。
識別列を作成するには、CREATE TABLE
のGENERATED ... 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');
同様に、キーワードDEFAULT
はUPDATE
コマンドでも使用できます。
したがって、多くの点で、識別列はデフォルト値のある列のように動作します。
識別列の定義のALWAYS
およびBY DEFAULT
句は、INSERT
およびUPDATE
コマンドでユーザが明示的に指定した値をどのように処理するかを決定します。
INSERT
コマンドでは、ALWAYS
が選択されている場合、INSERT
がOVERRIDING SYSTEM VALUE
を指定している場合にのみ、ユーザ指定の値が受け入れられます。
BY DEFAULT
を選択すると、ユーザ指定の値が優先されます。
したがって、BY DEFAULT
を使用すると、明示的な値によって上書きできるという、デフォルト値により似た動作になります。
一方、ALWAYS
では、誤って明示的な値を挿入することに対する保護が強化されます。
識別列のデータ型は、シーケンスでサポートされているデータ型の1つである必要があります。(CREATE SEQUENCEを参照。) 関連付けられたシーケンスの属性は、識別列の作成時に指定するか(CREATE TABLEを参照)、後で変更できます(ALTER TABLEを参照)。
識別列は自動的にNOT NULL
とマークされます。
ただし、識別列は一意性を保証しません。
(通常、シーケンスは一意な値を戻しますが、シーケンスはリセットにするか、前述のように識別列に値を手動で挿入できます。)
一意性を強制するには、PRIMARY KEY
またはUNIQUE
制約を使用する必要があります。
テーブル継承階層では、子テーブルの識別列とその属性は、親テーブルの識別列とその属性から独立しています。
子テーブルは、親から自動的に識別列またはその属性を継承しません。
INSERT
またはUPDATE
のときにSQL文で書かれたテーブルの列が識別列である場合、その列は識別列として扱われ、対応する識別列の属性が適用されます。
パーティションは、パーティションテーブルから識別列を継承します。 各パーティションが独自の識別列を持つことはできません。 識別列の属性はパーティション階層内のすべてのパーティションで一貫しています。