🐘
[Postgres]シーケンスの作成
シーケンスの定義
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 | シーケンスの最小値 | 1 (NO MINVALUEを指定した時) |
MAXVALUE | シーケンスの最大値 | データ型の最大値 (NO MAXVALUEを指定した時) |
START (WITH) | 開始値 | 昇順 → MINVALUE 降順 → MAXVALUE |
CACHE | メモリにキャッシュする数値の数を指定 | 1 |
CYCLE | 限界値に達した時の動作 ・CYCLE → 周回する ・NO CYCLE → エラー |
NO CYCLE |
OWNED BY | テーブル列が削除されたとき ・列名指定 → シーケンスも削除 ・NONE → 削除されない |
NONE |
おわりに
連番の作成方法について、業務でシーケンスを使用する際に調べたことをまとめてみました。
連番作成で最初に考えた方法は、COUNT()関数を使用して連番を生成することでした。
しかし、ロールバック時に番号の重複が発生する可能性があるという指摘を受け、シーケンスを使用する方法に変更しました。
連番となる行がPKだったので、シーケンスのほうが適切でCOUNT()関数の特徴を考慮しきれていなかったところが反省点ですね🤦♂️
Discussion