PostgreSQL GENERATED AS IDENTITY

PosetgreSQL 10以降では、serial の代わりに GENERATED AS IDENTITY が使える。

CREATE TABLE user(
   id BIGINT GENERATED ALWAYS AS IDENTITY,
-- 以降省略 --

シーケンス値の開始から省略せずに書くなら

id BIGINT GENERATED ALWAYS AS IDENTITY( INCREMENT BY 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 1 CACHE 1 NO CYCLE) NOT NULL,

テーブルを作成した時に、user テーブル、id のシーケンスとして

CREATE SEQUENCE user_id_seq
   INCREMENT BY 1
   MINVALUE 1
   MAXVALUE 9223372036854775807
   START 1
   CACHE 1
   NO CYCLE;

で自動作成される。

GENERATED ALWAYS AS IDENTITY が意味するところは、
インサート時に値を指定する場合、OVERRIDING SYSTEM VALUE を指定しないと
PostgresException 428C9 エラーになる。

VALUESの前に、OVERRIDING SYSTEM VALUE を書く。

INSERT INTO user (id, name, message) 
OVERRIDING SYSTEM VALUE VALUES
( 1001, 'maria', 'test' )

GENERATED BY DEFAULT AS IDENTITY で定義すれば、serial同様にインサート時に値を指定が可能

リセットする時は、
(1)TRUNCATE と共にリセットする場合、
  TRUNCATE TABLE テーブル名 RESTART IDENTITY;

(2)値だけ変更(リセット)する
  シーケンス関数 setval を使って
    setval('テーブル名_カラム名_seq', 1, false)
  ⇒ 実行後、1から開始する。