PostgreSQL: SERIAL vs IDENTITY どっちを使うべき?【最新版】

2024-04-02

PostgreSQLにおけるSERIALとIDENTITYの比較

概要

SERIALはPostgreSQL独自のデータ型で、自動的に増加する整数値を生成します。一方、IDENTITYはSQL標準に準拠した機能で、列に自動的に一意の値を生成するための制約です。

主な違い

項目SERIALIDENTITY
データ型特殊なデータ型INTEGER
SQL標準非準拠準拠
シーケンス自動生成オプション
制約NOT NULLGENERATED ALWAYS AS IDENTITY
値の挿入制限なしDEFAULT値を省略可能
変更困難比較的容易
互換性PostgreSQLのみ多くのデータベース

詳細

SERIALは、以下の特徴を持つPostgreSQL特有のデータ型です。

  • 自動的に1ずつ増加する整数値を生成
  • PRIMARY KEYとしてよく使用
  • シーケンスを使用して値を管理
  • NOT NULL制約が自動的に適用
  • DEFAULT値を省略できない
  • 一度設定すると変更が困難

IDENTITYは、以下の特徴を持つSQL標準に準拠した機能です。

  • INTEGER型列に自動的に一意の値を生成
  • シーケンスの使用はオプション
  • GENERATED ALWAYS AS IDENTITY制約を使用して定義
  • 比較的容易に変更可能
  • 多くのデータベースで互換性

新プロジェクトではIDENTITYを使うことを推奨します。IDENTITYはSQL標準に準拠しており、より柔軟性と互換性があります。

既存のSERIALカラムをIDENTITYに変更することも可能です。ただし、いくつかの制限事項と注意点があります。

  • PostgreSQL 10以降が必要
  • シーケンスが存在する必要がある
  • DEFAULT値を使用していない必要がある

詳細は、PostgreSQL公式ドキュメントを参照してください。




SERIAL

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  name VARCHAR(255) NOT NULL
);

IDENTITY

CREATE TABLE users (
  id INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
  name VARCHAR(255) NOT NULL
);

IDENTITYによる既存のSERIALカラムの変更

ALTER TABLE users
ALTER COLUMN id SET DEFAULT NULL;
ALTER TABLE users
ALTER COLUMN id DROP CONSTRAINT users_pkey;
ALTER TABLE users
ADD CONSTRAINT users_pkey PRIMARY KEY GENERATED ALWAYS AS IDENTITY;

その他

  • シーケンスの使用
CREATE SEQUENCE users_id_seq;

CREATE TABLE users (
  id INTEGER PRIMARY KEY DEFAULT nextval('users_id_seq'),
  name VARCHAR(255) NOT NULL
);
CREATE TABLE users (
  id INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
  name VARCHAR(255)
);

補足

  • PostgreSQL 12以降では、IDENTITY列にデフォルト値を指定できます。
  • IDENTITY列は、UNIQUE制約やFOREIGN KEY制約に使用できます。



DEFAULT値とトリガー

CREATE TABLE users (
  id INTEGER NOT NULL,
  name VARCHAR(255) NOT NULL
);

CREATE TRIGGER users_insert_trigger BEFORE INSERT ON users
FOR EACH ROW
BEGIN
  NEW.id := nextval('users_id_seq');
END;

PL/pgSQL関数

CREATE FUNCTION next_id() RETURNS INTEGER AS $$
BEGIN
  RETURN nextval('users_id_seq');
END;
$$ LANGUAGE plpgsql;

CREATE TABLE users (
  id INTEGER NOT NULL DEFAULT next_id(),
  name VARCHAR(255) NOT NULL
);

UUID

CREATE TABLE users (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  name VARCHAR(255) NOT NULL
);

これらの方法は、それぞれ異なる利点と欠点があります。最適な方法は、具体的な要件によって異なります。

DEFAULT値とトリガーの利点と欠点

利点:

  • シンプルでわかりやすい
  • トリガーの管理が必要
  • INSERT速度が遅くなる可能性

PL/pgSQL関数の利点と欠点

  • より柔軟な制御が可能
  • 複雑なロジックを実装できる
  • PL/pgSQLの知識が必要
  • 複雑なコードになりやすい

UUIDの利点と欠点

  • 一意性が保証される
  • 分散環境で使いやすい
  • 16バイトと比較的長い
  • ソートや比較に時間がかかる

PostgreSQLで自動的に生成される主キーを作成するには、SERIALIDENTITY、DEFAULT値とトリガー、PL/pgSQL関数、UUIDなどいくつかの方法があります。最適な方法は、具体的な要件によって異なります。


postgresql


pglogicalとDebeziumによるリアルタイムクロスデータベースクエリ

postgres_fdw は、PostgreSQL 9.1 以降で利用可能な公式の外国データラッパー (FDW) です。 FDW は、あたかもローカルテーブルであるかのように、リモートデータベースのテーブルにアクセスするための仕組みを提供します。 postgres_fdw を使用すると、以下のことができます。...


pgModeler、Valentina Studio、Aqua Data Studio... あなたに合ったPostgreSQLデータベーステーブル図生成ツールは?

pg_dump: PostgreSQL に標準で付属するコマンドラインツールです。テーブル構造をテキスト形式で出力できます。出力結果を Graphviz などのツールで処理することで、ER図を生成できます。erdtool: PostgreSQL のデータベーススキーマからER図を生成するコマンドラインツールです。シンプルなER図を素早く生成したい場合に便利です。...


PostgreSQLでRETURNINGとON CONFLICTを使ってUPSERTを行う方法

RETURNING句は、INSERTステートメントによって実際に挿入された(またはON CONFLICT DO UPDATE句によって更新された)各行に基づいて計算された値を返すために使用されます。これは、通番のシーケンス番号など、デフォルトで与えられた値を取り出す時に主に便利です。...


SQL SQL SQL SQL Amazon で見る



PostgreSQLにおけるAUTO_INCREMENTに相当するデータ型

MySQLのAUTO_INCREMENTは、PostgreSQLではいくつかのデータ型で実現できます。それぞれのデータ型には、わずかな違いと利点・欠点があります。データ型SERIAL - 最も一般的で、自動的に1から始まる整数値を生成します。


PostgreSQL で明示的な ID 挿入時に自動インクリメント機能を無効化しない方法:その他の選択肢

PostgreSQLにおいて、テーブルに SERIAL 型の列を定義し、明示的に ID 値を指定してレコードを挿入した場合、自動インクリメント機能が働かず、意図した ID 値が割り当てられない問題が発生することがあります。本記事では、この問題の詳細な原因と解決策について、分かりやすく解説します。