技術
2025.9.4(Thu)
【初心者向け】PostgreSQLでのシーケンス作成・利用方法まとめ
目次
こんにちは、関口です。
業務でID採番や連番管理をしていて、「PostgreSQLのシーケンスってどう使うの?」と感じたことはありませんか? 今回は、PostgreSQLでのシーケンスの作り方・使い方を、実務にすぐ活かせる形でご紹介します。
検証環境は以下になります。
- PostgreSQL
- 12.3
シーケンスとは?
シーケンスとは、連番を生成するデータベースのオブジェクトです。主に主キーや一意のIDの生成など、連続した番号が必要な場面で使用します。データベース・サーバーが生成された数値を追跡できるため、異常終了して再始動しても、重複した番号が生成されることなく使用できます。
CREATE SEQUENCEでの作成
それでは早速、シーケンスを作成してみましょう。
CREATE SEQUENCE sample_id_seq INCREMENT BY 1 -- 増分値 MINVALUE 1 -- 最小値 MAXVALUE 99999999 -- 最大値 START WITH 1 -- 初期値 CACHE 1 -- キャッシュ値 ;
設定した項目の説明です。全ての項目が省略可能となっています。
- INCREMENT BY:
現在のシーケンスの値から新しいシーケンス値を作成する際の値の増加量を設定します。正の値が指定された時は昇順のシーケンス、負の値が指定された時は降順のシーケンスを作成します。 指定がない場合のデフォルト値は1です。 - MINVALUE:
シーケンスとして作成する最小値を指定します。デフォルトの最小値は、昇順の時は1、降順の時はそのデータ型の最小値です。 - MAXVALUE:
シーケンスの最大値を決定します。デフォルトの最大値は、昇順の時はそのデータ型の最大値、降順の時は-1です。 - START:
任意の数からシーケンス番号を開始することができます。デフォルトでは、昇順の場合MINVALUEの値、降順の場合MAXVALUEの値になります。 - CACHE:
あらかじめ番号を割り当て、メモリに格納しておくシーケンス番号の量を指定します。 最小値は1で、これがデフォルトになっています。
CREATE TABLEでシーケンスを使う
では先ほど作成したシーケンスを使ってテーブルを作成してみましょう。DEFAULT句にシーケンスを設定します。
CREATEXX TABLE sequence_training(
id INTEGER NOT NULL DEFAULT nextval('sample_id_seq'), -- ID
title VARCHAR(255) NOT NULL, -- タイトル
content TEXT -- 内容
);
CREATE TABLEでSERIAL型を使う
CREATE TABLEの際、項目の型に「SERIAL」を設定すれば、自動でシーケンスが作成されます。
CREATEXX TABLE sequence_training2( id SERIAL NOT NULL, -- ID title VARCHAR(255) NOT NULL, -- タイトル content TEXT -- 内容 );
シーケンスの値を確認する
SERIAL型で作成したシーケンスがどう作られているのか、確認してみましょう。psqlの「\d」コマンドで確認します。シーケンス名は「テーブル名_項目名_seq」で作成されています。
postgres=# \d sequence_training2_id_seq;
シーケンス "public.sequence_training2_id_seq"
型 | 開始 | 最小 | 最大 | 増分 | 循環? | キャッシュ
---------+------+------+------------+------+--------+------------
integer | 1 | 1 | 2147483647 | 1 | no | 1
所有者: public.sequence_training2.id
INSERT文でシーケンスを使う
シーケンスが作成できたら、INSERT文でシーケンスを使ってみましょう。シーケンスは指定しないでINSERTすることも可能です。
-- シーケンスを指定する場合
INSERT INTO sequence_training VALUES (NEXTVAL('sample_id_seq'), '練習1', 'INSERT文でシーケンスを指定してみます。');
-- シーケンスを指定しない場合
INSERT INTO sequence_training(title, content) VALUES ('練習2', 'INSERT文でシーケンスを省略します。');
実行した結果は下記です。
postgres=# SELECT * FROM sequence_training; id | title | content ----+-------+---------------------------------------- 1 | 練習1 | INSERT文でシーケンスを指定してみます。 2 | 練習2 | INSERT文でシーケンスを省略します。 (2 行)
シーケンスの値を変更する
シーケンスの値がズレてしまった場合などに活用しましょう。
-- シーケンスを1つ進める
SELECT NEXTVAL('sample_id_seq');
-- シーケンスを任意の値に設定する
SELECT SETVAL('sample_id_seq', 777);
実行した結果は下記です。
-- シーケンスを1つ進める
nextval
---------
3
(1 行)
-- シーケンスを任意の値に設定する
setval
--------
777
(1 行)
まとめ
いかがでしたでしょうか。
シーケンスの使い方を正しく理解して、活用していきましょう。それではまた。
《関連記事》
ITエンジニアリング事業部 チーフ
Sekiguchi
社内イベントや技術情報など、内容だけでなく楽しさも伝えられるよう心がけています。
MOST VIEWED ARTICLES


