【初心者向け】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 行)

まとめ

いかがでしたでしょうか。
 
シーケンスの使い方を正しく理解して、活用していきましょう。それではまた。
 
 
 
 
《関連記事》

時間帯・曜日別に集計するSQL
技術
2023.11.10(Fri)

PostgreSQLで時系列データを分析! 時間帯・曜日別に集計するSQL

#データベース#SQL

GROUP BYの使い方
技術
2024.5.23(Thu)

【SQL入門】複数のデータをグループ化するGROUP BYの使い方

#SQL

PostgreSQLのBETWEENで日付を比較する方法
技術
2024.6.6(Thu)

初心者必見!PostgreSQLのBETWEENで日付を比較する方法

#SQL

記事をシェア
MOST VIEWED ARTICLES