シーケンス しーけんす
簡単に言うとこんな感じ!
シーケンスは、データベースが「1、2、3、4…」って自動で番号を振り続けてくれる仕組みだよ。会員登録するたびに「会員番号:00001、00002…」と自動採番されるアレ!人間が手動で管理しなくていいから、重複や抜け番の心配がなくなるんだ!
シーケンスとは
シーケンス(Sequence)とは、データベースが一意な連続した整数を自動生成するためのオブジェクトのことです。テーブルに新しいレコードを追加するたびに、重複しない番号を自動的に払い出してくれる「番号発行機」のような役割を担います。
主な用途は主キー(Primary Key)の自動採番です。たとえば「注文ID」「社員番号」「伝票番号」など、各レコードを一意に識別するための番号をアプリケーション側で管理する必要がなくなります。複数のユーザーが同時にレコードを追加しても、データベースが内部で調整するので番号の重複や競合が発生しないという大きなメリットがあります。
シーケンスは主に Oracle や PostgreSQL などのデータベースで「シーケンスオブジェクト」として独立した機能として提供されています。MySQL では類似機能として AUTO_INCREMENT 属性が使われており、SQL Server では IDENTITY プロパティが同等の役割を果たします。
シーケンスの仕組みと設定項目
シーケンスを作成する際には、以下のパラメータを設定できます。
| パラメータ | 説明 | 例 |
|---|---|---|
| START WITH | 開始値 | 1、1000 など |
| INCREMENT BY | 増分(飛び番にも対応) | 1、10 など |
| MINVALUE | 最小値 | 1 |
| MAXVALUE | 最大値 | 9999999999 |
| CYCLE / NO CYCLE | 最大値到達後に最小値へ戻るか | 通常はNO CYCLE |
| CACHE | あらかじめ確保する番号数(高速化) | 20、100 など |
基本的なSQL構文
-- PostgreSQLでのシーケンス作成例
CREATE SEQUENCE order_id_seq
START WITH 1
INCREMENT BY 1
NO CYCLE;
-- 次の値を取得する
SELECT NEXTVAL('order_id_seq'); -- → 1, 2, 3 ...
-- 現在の値を確認する
SELECT CURRVAL('order_id_seq');
覚え方:「シーケンス=順番待ちの整理券機」
映画館やレストランの入口にある整理券の発券機をイメージしてください。「1番」「2番」と次々に発行され、同じ番号は絶対に出ない。シーケンスもまったく同じ役割です。
シーケンスが必要な理由
なぜシーケンスが必要なのか、アプリ側で管理した場合との比較で考えてみましょう。
【アプリ側で採番した場合の問題】
ユーザーA → DBに「最大ID=100を取得」 ─┐
ユーザーB → DBに「最大ID=100を取得」 ─┤← 同時に取得!
│
ユーザーA → ID=101 でINSERT ─┤
ユーザーB → ID=101 でINSERT ─┘← 重複エラー発生!
【シーケンスを使った場合】
ユーザーA → NEXTVAL取得 → 101 ─┐
ユーザーB → NEXTVAL取得 → 102 ─┘← DB側で排他制御 → 重複なし!
シーケンスはデータベースエンジンが原子的(アトミック)に番号を発行するため、どれだけ同時アクセスが発生しても重複が起きない設計になっています。
歴史と背景
- 1970年代後半:リレーショナルデータベースの概念が普及し始め、レコードを一意に識別する主キーの自動採番が課題になる
- 1980年代:OracleがSequenceオブジェクトをいち早く実装し、商用DBの標準的な機能として定着
- 1992年:SQL標準(SQL-92)では自動採番の標準仕様は含まれず、各DBベンダーが独自実装を続ける
- 2003年:SQL:2003でシーケンスが国際標準として正式に仕様化(
CREATE SEQUENCE構文) - 2000年代〜現在:PostgreSQLが完全対応、MySQL系は
AUTO_INCREMENT、SQL ServerはIDENTITYとSEQUENCEの両方を実装し、機能が収束しつつある - 現在:UUIDや分散ID(Snowflakeなど)の登場により、クラウド・分散システムでは連番以外の採番方式も広まっているが、シーケンスは依然として基幹業務システムで広く使われている
主要DBでの実装比較
データベースによって名称や構文は異なりますが、役割はほぼ同じです。
シーケンスと UUID の違い
大規模システムやクラウド環境では、連番の代わりに UUID(汎用一意識別子) が使われることもあります。
| 項目 | シーケンス(連番) | UUID |
|---|---|---|
| 値の例 | 1, 2, 3, 1000… | 550e8400-e29b-41d4... |
| 可読性 | ◎ 人間が読みやすい | △ 長くて読みにくい |
| 分散環境 | △ DB集中管理が必要 | ◎ 各ノードで独立生成可 |
| 順序保証 | ◎ 挿入順がわかる | △ 順序なし(UUIDv7は改善) |
| 推測リスク | △ 件数が推測できる | ◎ 推測不可能 |
| インデックス効率 | ◎ 連番は高速 | △ ランダム値はやや遅い |
関連する規格・RFC
| 規格 | 内容 |
|---|---|
| ISO/IEC 9075-2:2003(SQL:2003) | CREATE SEQUENCE 構文がSQL国際標準として初めて定義された |
| ISO/IEC 9075-2:2016(SQL:2016) | GENERATED ALWAYS AS IDENTITY など自動採番の拡張仕様 |
関連用語
- 主キー(Primary Key) — テーブル内のレコードを一意に識別するための列。シーケンスで自動採番されることが多い
- AUTO_INCREMENT — MySQLにおける自動採番属性。シーケンスと同等の役割を持つ
- UUID — 連番に代わる一意識別子の生成方式。分散システムで広く使われる
- トランザクション — データベース操作の原子性を保証する仕組み。シーケンス発行もトランザクションと密接に関わる
- インデックス — テーブルの検索を高速化する仕組み。主キーには自動的にインデックスが作られる
- テーブル — シーケンスが採番した値を格納するデータの基本単位
- DDL(Data Definition Language) —
CREATE SEQUENCEなどのデータ構造を定義するSQL命令の総称