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から開始する。