【PostgreSQL】シーケンスを完全マスター!自動採番の仕組みと活用術

スポンサーリンク

データベースを使っていると、一意なIDを自動で生成したい場面がよくあります。例えば、ユーザーや商品の登録番号など、重複しない連番を管理することは、システムの安定性やデータの一貫性を保つ上で非常に重要です。

PostgreSQLでは、このような自動採番のニーズに応えるために「シーケンス」という機能が用意されています。シーケンスは、特定の規則に従った数値を生成する仕組みで、テーブルの主キーやユニークな識別子を作成する際によく使われます。

この記事では、シーケンスの基本的な使い方をわかりやすく解説します。これを読めば、シーケンスの仕組みや活用方法をマスターし、より効率的なデータベース運用が実現できるでしょう!

シーケンスの基本

PostgreSQLのシーケンスは、一意の数値を自動生成する仕組みです。この機能は主に、主キーの自動採番やユニークな識別子を生成する際に利用されます。

シーケンスの作成方法

シーケンスを作成するには、CREATE SEQUENCE 文を使用します。以下は基本的な構文です。

CREATE SEQUENCE シーケンス名
[ INCREMENT BY 増分 ]
[ MINVALUE 最小値 ]
[ MAXVALUE 最大値 ]
[ START WITH 開始値 ]
[ CYCLE | NO CYCLE ];

オプションについて簡単に説明します。

  • INCREMENT BY
    シーケンスの増分を指定します(デフォルトは1)。
  • MINVALUE / MAXVALUE
    シーケンスの最小値と最大値を設定します。
  • START WITH
    シーケンスが開始する初期値を指定します(デフォルトは1)。
  • CYCLE
    最大値または最小値に到達した後に、値をリセットして再利用する場合に指定します。

シーケンスを作成する例

以下は、基本的なシーケンスを作成する例です。

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

このシーケンスは、1からスタートし、1ずつ増加していきます。

シーケンスの利用方法

作成したシーケンスは、NEXTVAL 関数を使って次の値を取得できます。

SELECT NEXTVAL('user_id_seq');

また、現在の値を取得するには CURRVAL を使用します。

SELECT CURRVAL('user_id_seq');

シーケンスをテーブルと連携させる

テーブルの列にシーケンスを自動的に割り当てるには、以下のように DEFAULT を指定します。

CREATE TABLE users (
    id BIGINT DEFAULT NEXTVAL('user_id_seq') PRIMARY KEY,
    name TEXT NOT NULL
);

これにより、データを挿入する際に id の値が自動的にシーケンスから採番されます。

シーケンスを使用した例

シーケンスは、データベースで一意の値を生成する際に非常に便利な機能です。このセクションでは、具体的なシーケンスの使用例をいくつか紹介します。

シンプルなシーケンスの利用

シーケンスの基本的な使用例として、NEXTVAL を使って次の値を取得します。

SELECT NEXTVAL('user_id_seq');

上記の例では、user_id_seq シーケンスから次の番号を取得します。この値をアプリケーションやテーブルに利用することで、一意な番号を確保できます。

テーブルのDEFAULT値としてシーケンスを使用

シーケンスは、テーブルの列に自動採番を設定するためによく利用されます。以下の例では、ユーザーテーブルの id 列にシーケンスを紐づけています。

CREATE TABLE users (
    id BIGINT DEFAULT NEXTVAL('user_id_seq') PRIMARY KEY,
    name TEXT NOT NULL
);

この設定により、新しいレコードを挿入する際に id の値を自動で採番できます。

INSERT INTO users (name) VALUES ('Alice');
INSERT INTO users (name) VALUES ('Bob');
SELECT * FROM users;

結果

複数テーブルで同じシーケンスを共有

1つのシーケンスを複数のテーブルで利用することも可能です。例えば、以下のように異なるテーブルで同じシーケンスを使用することができます。

CREATE TABLE orders (
    id BIGINT DEFAULT NEXTVAL('shared_seq') PRIMARY KEY,
    order_date DATE NOT NULL
);

CREATE TABLE invoices (
    id BIGINT DEFAULT NEXTVAL('shared_seq') PRIMARY KEY,
    amount NUMERIC NOT NULL
);

これにより、両方のテーブルで一意な番号を共有できます。

カスタムシーケンスによる応用例

場合によっては、特定の規則に従った値を生成したいことがあります。その場合、シーケンスをカスタマイズすることで対応できます。

CREATE SEQUENCE custom_seq
START WITH 1000
INCREMENT BY 5
MINVALUE 1000
MAXVALUE 9999
CYCLE;

このシーケンスでは、値が 1000 からスタートし、5 ずつ増加します。また、9999 に到達すると再び 1000 に戻ります(CYCLE オプション)。

SELECT NEXTVAL('custom_seq'); -- 1000
SELECT NEXTVAL('custom_seq'); -- 1005
SELECT NEXTVAL('custom_seq'); -- 1010

シーケンスは、使い方次第でデータベースの設計や運用を大幅に効率化します。次のセクションでは、シーケンスの管理や設定の変更方法について解説します。

シーケンスの管理方法

シーケンスを効率的に利用するためには、その現在の値を確認したり、設定を変更したりする方法を知っておくことが重要です。このセクションでは、シーケンスの管理方法について解説します。

現在の値を確認する

シーケンスの現在の値は、CURRVAL 関数を使って取得できます。ただし、CURRVAL を使用するには、現在のセッション内でそのシーケンスの NEXTVAL を一度呼び出している必要があります。

SELECT CURRVAL('user_id_seq');

これにより、user_id_seq の現在の値が返されます。

次に生成される値を確認する

次に生成される値を確認したい場合は、NEXTVAL を使用します。以下の例では、次の値を取得します。

SELECT NEXTVAL('user_id_seq');

注意NEXTVAL を呼び出すとシーケンスの値が実際に進む(増加する)ため、現在の値を確認するだけの場合は CURRVAL を使用してください。

シーケンスの値をリセットまたは変更する

SETVAL 関数を使うと、シーケンスの現在の値を任意の値に設定できます。

SELECT SETVAL('user_id_seq', 100);

上記の例では、user_id_seq の現在の値を 100 にリセットします。

オプションとして、第2引数に true を指定すると、次回の NEXTVAL 呼び出し時に 101 が返されます。

シーケンスの設定を変更する

既存のシーケンスの設定を変更するには、ALTER SEQUENCE 文を使用します。たとえば、増分値を変更する場合は以下のように記述します。

ALTER SEQUENCE user_id_seq INCREMENT BY 2;

他にも、以下の設定を変更できます。

  • 開始値 (START WITH)
  • 最小値 (MINVALUE)
  • 最大値 (MAXVALUE)
  • CYCLE の有無

シーケンスの削除

不要になったシーケンスは、DROP SEQUENCE 文を使用して削除できます。

DROP SEQUENCE user_id_seq;

複数のシーケンスを同時に削除する場合は、カンマ区切りで記述します。

DROP SEQUENCE seq1, seq2;

まとめ

PostgreSQLのシーケンスは、一意な数値を自動で生成できる便利な機能です。特に、自動採番が必要な主キーやユニークな識別子の生成において、その力を発揮します。この記事では、以下のポイントを解説しました。

  • シーケンスの基本的な仕組みと作成方法
  • テーブルとの連携による自動採番の設定方法
  • シーケンスの現在値確認や設定の変更方法

シーケンスを適切に活用することで、データベースの設計と運用を効率化し、エラーのリスクを軽減できます。また、シーケンスはシンプルで柔軟な機能を持つため、小規模から大規模なプロジェクトまで幅広く役立つでしょう。

この記事を参考に、ぜひPostgreSQLでシーケンスを活用してみてください!

コメント