🤖
【PostgreSQL】IDENTITYについて
IDENTITYとは?
PostgreSQLのIDENTITY列は、テーブルの特定の列に自動採番(シーケンス)を設定するためのしくみです。PostgreSQL10以降で導入されました。
使用例
GENERATED ALWAYS AS IDENTITY
→ 常に自動生成される(手動で値を入れようとするとエラー)
CREATE TABLE users (
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name TEXT NOT NULL
);
-- 〇正常に動作(idは自動採番)
INSERT INTO users (name) VALUES ('鈴木原');
-- Xエラー(idを明示的に指定するとダメ)
INSERT INTO users (id, name) VALUES (1, '田中川');
GENERATED BY DEFAULT AS IDENTITY
→ デフォルトで自動生成されるが、手動の値もOK
CREATE TABLE users (
id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
name TEXT NOT NULL
);
-- 〇正常に動作(idは自動採番)
INSERT INTO users (name) VALUES ('鈴木原');
-- 〇正常に動作(idを指定してもOK)
INSERT INTO users (id, name) VALUES (100, '田中川');
<出力例>

ただし、以下を行うと
CREATE TABLE users (
id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
name TEXT NOT NULL
);
-- 〇正常に動作(idは自動採番)
INSERT INTO users (name) VALUES ('鈴木原');
-- 〇正常に動作(idを指定してもOK)
INSERT INTO users (id, name) VALUES (100, '田中川');
-- 〇正常に動作(idは自動採番)
INSERT INTO users (name) VALUES ('及川山');
↓のような結果になりました

シーケンス名を調べる
シーケンス名は基本「<テーブル名>_<カラム名>_seq」となっています。(例外あり)
users:テーブル名、id:フィールド名
SELECT pg_get_serial_sequence('users', 'id');
<出力例>

シーケンスが現在何番なのか調べる
users_id_seqがシーケンス名
SELECT last_value FROM public.users_id_seq;
<出力例>

ID(シーケンス)の値をリセットする
users_id_seqがシーケンス名
ALTER SEQUENCE users_id_seq RESTART WITH 1;
シーケンス名を変更
シーケンス機能はそのまま継続されます
「users_id_seq」を「custom_user_id_seq」に変更
ALTER SEQUENCE users_id_seq RENAME TO custom_user_id_seq;
Discussion