tl; dr
Postgres 10で、 GENERATED BY DEFAULT AS IDENTITY
を指定します。 SQL標準に従って。
create table tower
(
npages integer,
ifnds integer,
ifnid integer,
name varchar(20),
towid integer GENERATED BY DEFAULT AS IDENTITY -- per SQL standard
)
ID列
Postgres 10は、identity列 の概念をサポートするようになりました。 、および標準のSQL構文を使用します。私はMSSQLServerの専門家ではありませんが、この新しい標準サポートは同等だと思います。
生成された…IDとして
GENERATED…ASIDENTITY
CREATE TABLE
中に使用されるコマンド 暗黙のシーケンスを作成します。 SERIAL
とは異なり、そのシーケンスの作成、命名、権限、および削除は透過的です。 。今では非常に直感的です。テーブルに使用権限を付与すると、シーケンスの使用権限が付与されます。テーブルを削除すると、シーケンスは自動的に削除されます。
標準構文の2つのフレーバー。違いは、値を生成させるのではなく、値を渡す場合にのみ重要です。通常、人々は常に生成された値に依存するため、通常は最初のバージョンである GENERATED BY DEFAULT AS IDENTITY
を使用します。 。
デフォルトでIDとして生成
-
INSERT
でない限り、値を生成します コマンドは値を提供します。
-
常にIDとして生成
-
INSERT
によって提供される値を無視しますOVERRIDING SYSTEM VALUE
を指定しない限り
-
CREATE TABLE
を参照してください
ドキュメントのページ。
この興味深いページ
をお読みください PeterEisentrautによる。彼はSERIAL
に関するいくつかの奇妙な問題について説明しています 。新しいID列機能にはそのような問題はありません。したがって、 SERIAL
を使用する理由はありません。 もう、マイナス面はなく、プラス面のみです。 シリアル
GENERATED…ASIDENTITY
に取って代わられます 。
ID列は必ずしも主キーである必要はなく、自動的にインデックスが作成されるわけではないことに注意してください。したがって、 PRIMARY KEY
を指定する必要があります。 それがあなたの意図であるかどうかを明示的に(通常の場合のように)。
CREATE TABLE person_ (
id_
INTEGER
GENERATED BY DEFAULT AS IDENTITY -- Replaces SERIAL. Implicitly creates a SEQUENCE, specified as DEFAULT.
PRIMARY KEY -- Creates index. Specifies UNIQUE. Marks column for relationships.
,
name_
VARCHAR( 80 )
) ;
意図は、内部実装の詳細があなたから隠されることです。秘密裏に生成されているシーケンスの名前を知っている必要はありません。たとえば、基になるシーケンスを知らなくても、列を介してカウンターをリセットできます。
ALTER TABLE person_
ALTER COLUMN id_
RESTART WITH 1000 -- Reset sequence implicitly, without a name.
;
IDを暗黙的に指定する:
- 列にマークを付ける
NOTNULL
- シーケンスを作成します
- シーケンスのタイプが列と一致します(32ビット64ビットなど)
- シーケンスを列に結び付けます
- 権限を継承します
- カスケードドロップ
- 列の名前が変更されても、列に関連付けられたままになります
- その列のデフォルト値のソースとしてシーケンスを指定します
ID列は、 CREATESEQUENCE<と同じオプションを使用できます。 / code>
:
-
START WITH start
-
MINVALUE minvalue
|NO MINVALUE
-
MAXVALUE maxvalue
|NO MAXVALUE
-
INCREMENT[BY]インクリメント
-
CYCLE
|NO CYCLE
-
CACHE
キャッシュ 所有者なし
(所有権は自動的に管理されるため、ID列に所有権を指定しても意味がありません)
オプションの愚かな例:
id_ INTEGER
GENERATED BY DEFAULT AS IDENTITY (
START WITH 200
MINVALUE 100
MAXVALUE 205
CYCLE
INCREMENT BY 3
) PRIMARY KEY
4行の追加: