データベースを使っていると、一意な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でシーケンスを活用してみてください!
コメント