🤖

【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