データベース基本概念

シーケンス しーけんす

連番自動採番主キーAUTO_INCREMENTPostgreSQLOracle
シーケンスについて教えて

簡単に言うとこんな感じ!

シーケンスは、データベースが「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はIDENTITYSEQUENCEの両方を実装し、機能が収束しつつある
  • 現在:UUIDや分散ID(Snowflakeなど)の登場により、クラウド・分散システムでは連番以外の採番方式も広まっているが、シーケンスは依然として基幹業務システムで広く使われている

主要DBでの実装比較

データベースによって名称や構文は異なりますが、役割はほぼ同じです。

主要データベースのシーケンス実装比較 Oracle CREATE SEQUENCE (標準シーケンス) NEXTVAL / CURRVAL CACHE対応 CYCLE対応 ORDER保証オプション PostgreSQL CREATE SEQUENCE (標準シーケンス) NEXTVAL / CURRVAL SERIAL / BIGSERIAL型 GENERATED AS IDENTITY SQL:2003準拠 MySQL / MariaDB AUTO_INCREMENT (列属性として設定) INSERT時に自動採番 LAST_INSERT_ID() MySQL 8.0~CREATE SEQUENCE対応 テーブル単位の制約 SQL Server IDENTITY列 + SEQUENCE対応 SCOPE_IDENTITY() NEXT VALUE FOR SQL Server 2012~ SQL:2003準拠

シーケンスと 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命令の総称