🐘

[Postgres]シーケンスの作成

2024/11/24に公開

シーケンスの定義

CREATE [TEMPORARY] SEQUENCE [IF NOT EXISTS] [schema_name.]squence_name
    [AS data_type]
    [INCREMENT (BY)]
    [MINVALUE | NO MINVALUE]
    [MAXVALUE | NO MAXVALUE]
    [START (WITH)]
    [CACHE]
    [CYCLE | NO CYCLE]
    [OWNED BY table_name.column_name | OWNED BY NONE]

各オプションについて

オプション名 説明 省略したとき
TEMPORARY セッション終了時に削除される
シーケンスを作成
永続化
IF NOT EXISTS 同名のシーケンスがあったとき
エラーを出さず、スキップ
エラー
schema_name シーケンスを作成したい
スキーマを指定
カレントスキーマ
AS data_type データ型を指定
(smallint、integer、bigint)
bigint
INCREMENT (BY) インクリメント量
・正の値 → 昇順
・負の値 → 降順
+1
MINVALUE シーケンスの最小値
(NO MINVALUEを指定した時)
MAXVALUE シーケンスの最大値 データ型の最大値
(NO MAXVALUEを指定した時)
START (WITH) 開始値 昇順 → MINVALUE
降順 → MAXVALUE
CACHE メモリにキャッシュする数値の数を指定
CYCLE 限界値に達した時の動作
・CYCLE → 周回する
・NO CYCLE → エラー
NO CYCLE
OWNED BY テーブル列が削除されたとき
・列名指定 → シーケンスも削除
・NONE → 削除されない
NONE

おわりに

連番の作成方法について、業務でシーケンスを使用する際に調べたことをまとめてみました。

連番作成で最初に考えた方法は、COUNT()関数を使用して連番を生成することでした。
しかし、ロールバック時に番号の重複が発生する可能性があるという指摘を受け、シーケンスを使用する方法に変更しました。
連番となる行がPKだったので、シーケンスのほうが適切でCOUNT()関数の特徴を考慮しきれていなかったところが反省点ですね🤦‍♂️

Discussion