◀ 12.

Db2のシーケンスとIDENTITYの違い|採番とカタログの確認SQL

▶

Db2 LUWのIDENTITY列は表の列に属する採番属性、独立シーケンスは表とは別のオブジェクトです。違いを知りたいときは、定義を読む確認SQLと、実際に番号を発行する操作を分けます。

Db2のIDENTITY列と独立シーケンスの違いと定義の確認先を示す図

この記事の要点
  • DB2 のシーケンス vs ID 列(IDENTITY)
  • ID 列: テーブル列に紐づく自動採番(INSERT 時に発行)
  • シーケンス: 独立したオブジェクト。複数テーブル間で共有可能、任意のタイミングで採番
  • 確認: SYSCAT.SEQUENCES / SYSCAT.COLUMNS(IDENTITY フラグ)

 

旧版の未確認メモをIBMのカタログ資料で照合し、以下でIDENTITY列と独立シーケンスを区別して説明します。確認SQLは定義の照会であり、新しい値の採番や設定変更ではありません。

シーケンスとID列の違い

IDENTITYは表の列に定義する採番属性です。GENERATED ALWAYSとBY DEFAULTで明示値の扱いが違い、BY DEFAULTでは値を指定したINSERTもあり得ます。表名や列名がidであることだけではIDENTITYとは判断できません。

シーケンス:シーケンスオブジェクトとしてテーブルとは独立していて、SQLで任意のタイミングで採番されるもの。ID列と違い、テーブルの列に定義するものでもないので、テーブル間で使い回すことも可能。

 

シーケンスの確認方法

SYSCAT.SEQUENCESカタログビューでシーケンス/別名を確認できます。次の元のSELECT *は全範囲の一覧で、独立シーケンスだけに絞っていません。下の絞り込み例も参照してください。

SELECT * FROM SYSCAT.SEQUENCES

 

ID列の確認方法

列定義を確認するSYSCAT.COLUMNSカタログビューのIDENTITY列がYの行がIDENTITY属性を持つ列です。次の元の例はschemaを限定せず、全体から検索します。利用アカウントのカタログ参照権限を確認してください。

SELECT * FROM SYSCAT.COLUMNS WHERE IDENTITY = 'Y'

 

SEQTYPEの値は推測ではなく、カタログの分類として読みます。

SYSCAT.SEQUENCESのSEQTYPEはSが独立シーケンス、Iがidentity sequence、Aが別名です。Iの存在は確認できますが、IDENTITYを定義した表/列の確認にはSYSCAT.COLUMNS.IDENTITYを使います。

内部にidentity sequenceがあっても、IDENTITY列とCREATE SEQUENCEで作る独立オブジェクトは同じ操作対象ではありません。内部名を推測してNEXT VALUE/ALTER/DROPの対象にせず、列の属性と独立シーケンスを分けて扱います。

 

指定schemaのIDENTITY列を確認するSQL

次の?へカタログに保存されている正確なschema名をバインドします。GENERATEDのAはALWAYS、DはBY DEFAULTです。ただしGENERATEDだけなら式で生成される列等もあるため、IDENTITY=Yと組み合わせます。COLNOは0始まりで、表示はschema・表・列順です。

SELECT TABSCHEMA, TABNAME, COLNO, COLNAME, IDENTITY, GENERATED
FROM SYSCAT.COLUMNS
WHERE TABSCHEMA = ?
  AND IDENTITY = 'Y'
ORDER BY TABSCHEMA, TABNAME, COLNO;

独立シーケンスだけを確認するSQL

次はSEQTYPE=Sに限定し、Iの内部採番やAの別名を除外します。?は確認済みschema名です。STARTは定義上の開始値で、「最後に使われたID」や既存行の最大値ではありません。別名を含めたいときはBASE_SEQSCHEMA/BASE_SEQNAME等を対象版の資料で確認します。

SELECT SEQSCHEMA, SEQNAME, SEQTYPE,
       "START", "INCREMENT", MINVALUE, MAXVALUE, "CYCLE", "CACHE"
FROM SYSCAT.SEQUENCES
WHERE SEQSCHEMA = ?
  AND SEQTYPE = 'S'
ORDER BY SEQSCHEMA, SEQNAME;

NEXTCACHEFIRSTVALUEは次のキャッシュ範囲等の管理値で、直近のINSERTのIDと同一視できません。また、NEXT VALUE FORは値を消費する式で、現在値を見るためだけの読取ではありません。この一覧の確認のために採番・再起動・RESTART・DROP/CREATEを実行しないでください。

IDENTITY・シーケンス・一意制約の違い

項目IDENTITY列独立シーケンス
定義対象表の特定の列schema内の独立オブジェクト
利用方法INSERTと列の生成属性に従うNEXT VALUE FOR等で値を取得して利用
主な確認先SYSCAT.COLUMNS.IDENTITY/GENERATEDSYSCAT.SEQUENCES、SEQTYPE=S
行の一意性採番とは別にPRIMARY KEY/UNIQUE等で要件を定義。明示値・RESTART・CYCLE等も考慮
欠番なし保証しない。rollback、消費後の失敗、cache/障害等を考慮

採番した値が残らず欠番になっても、その数字を再利用すべきとは限りません。NO CACHEにすればすべての欠番が消えるわけでも、ORDERにすればCOMMIT順/業務の処理順になるわけでもありません。請求番号等の業務連番は、監査・取消・再実行・並行処理を含む別要件として設計します。

採番済みIDと定義の照会を混同しない

INSERTが割り当てたIDは、同じ接続と対象のドライバーでgenerated keys等の返却方法を検討します。Db2のSELECT FROM INSERTによる取得やIDENTITY_VAL_LOCALもありますが、後者は同一処理レベルの単一行VALUES INSERT等の条件があり、複数行INSERTのID一覧を返す関数ではありません。接続プールで別接続に切り替えて同じ値を期待しないでください。

MAX(id)+1は並行処理が同じ候補を選び得るため、安全な採番の代わりになりません。定義変更や移行で開始値を合わせる場合も、他接続の採番・既存値・増減方向/範囲・明示値を確認し、運用停止や復旧を含めて計画します。この確認記事はリセット手順ではありません。

0件だったときの確認順

  1. 接続先DBと製品版が想定通りかを確認する。LUW、z/OS、iで同じカタログ/型名を前提にしない。
  2. 通常識別子と引用識別子を分け、正確なschema名を確認する。schema名は必ずしもログイン名ではない。
  3. 列名がidでもIDENTITY=Nなら、アプリ採番やトリガー等の別方式を確認する。SEQTYPE=Sの0件からIDENTITY列もないとは判断しない。
  4. カタログ参照とシーケンス利用/実データ参照の権限を分ける。確認のためにPUBLICへ広い権限を付けない。

関連と公式資料

schemaごとの列定義一覧 / 自動採番の記事(旧コードのリセット/上書き等は別途対象版・前提を確認)。元の関連導線である@Id、@GeneratedValue、No identifier specified for entity、Incorrect column specifier for column 'カラム名'はORM/他製品の別テーマとして保持します。

公式:列の属性 / SEQTYPEと管理値 / 方式の違い / シーケンスの値の消費 / IDENTITY_VAL_LOCALの条件。

対象範囲と検証

主にDb2 LUWを対象とし、2026年10月に公式資料と照合しました。元のDb2版のコードと情報を回復し、別製品へ置換されていた版も履歴に保持しています。追加SQLの条件・順序等はメモリ内の合成データで確認しましたが、Db2実機の構文/権限/ロック/負荷・全構成での変更成功を検証したものではありません。Db2親ページの子ページから選択してください。

子ページ

子ページはありません

同階層のページ
  1. DB接続コマンド
  2. データベース一覧の確認
  3. テーブル一覧の確認
  4. テーブル定義の確認
  5. DBの設定確認
  6. テーブルスペースの容量の確認および拡張
  7. データ型
  8. 複数カラムのUPDATE
  9. カラムの追加/削除/変更
  10. 自動番号付け (autoincrement) する方法
  11. インデックスの作成
  12. シーケンスおよびインクリメント(ID列)の違いと確認方法
  13. create table文の生成
  14. 特定スキーマの全テーブルの全カラム情報を取得する方法
  15. 【DB2】エラー一覧
  16. 【DB2】テーブル定義からCREATE TABLE文を生成する方法

最近更新/作成されたページ