シーケンス・オブジェクト

シーケンス とは、シーケンスの作成に使用される指定に基づいて、一連の数値を生成するユーザー定義のオブジェクトです。 シーケンスは、ID 列とは異なり、表とは関連付けられません。 アプリケーションは、シーケンス・オブジェクトを参照して、 その現在の値または次の値を獲得します。

数値の順序は、単調に昇順または降順で生成されます。 シーケンスと表の関係は、Db2ではなく、アプリケーションに制御されます。

アプリケーションは、シーケンス・オブジェクトを参照し、 複数の行および複数の表にまたがったキーとして、その値を調整できます。 しかし、シーケンス・オブジェクトからその値を得る表列は、 必ずしもその列の中で固有値を持つとは限りません。 シーケンス・オブジェクトを NO CYCLE 文節指定で定義した場合でも、 一部の他アプリケーションが、そのシーケンス・オブジェクトを参照して得る値を使わずに、 その表列に挿入する場合があります。

Db2は、要求の順序でシーケンス番号を常に生成します。 しかし、シーケンス値が複数の Db2 メンバーに同時にキャッシュされるデータ共用グループでは、シーケンス値の割り当てが数値順になっていない可能性があります。 加えて、以下の理由から、 シーケンス番号値にギャップが生じる場合があります。
  • Db2 がすべてのキャッシュされた値を割り当てる前に異常終了した場合
  • アプリケーションが、シーケンスを増分するトランザクションをロールバックする場合
  • NEXT VALUE を含むステートメントが、シーケンスの増分後失敗した場合

CREATE SEQUENCE ステートメントを使用してシーケンス・オブジェクトを作成し、ALTER SEQUENCE ステートメントを使用して変更し、DROP SEQUENCE ステートメントを使用してドロップします。 シーケンスへのアクセス権は、GRANT (特権) ON SEQUENCE ステートメント によって付与し、REVOKE (特権) ON SEQUENCE ステートメント によって取り消します。

シーケンスを生成するDb2値は、シーケンスの作成方法によって異なります。 START WITH オプションは、Db2 が生成する最初の値を決定します。 値は、INCREMENT BY 値によって、昇順または降順に進められます。

MINVALUE とMAXVALUE オプションは、 Db2 が生成する最小値と最大値を決定します。 CYCLE または NO CYCLE オプションは、 Db2 が昇順シーケンスの最大値または降順シーケンスの最小値に達したときに、生成された値を折り返すかどうかを決定します。

複数の表にわたるキー: 最初に NEXT VALUE 式を使用して最初の表の最初の行に挿入するためのシーケンス値を生成することによって、2 つの別々の表でキー値として同じシーケンス番号を使用できます。 続いて、PREVIOUS VALUE 式を使用してこの同じシーケンス値を参照して、2 番目の表に別の行を挿入できます。

例: ORDERS 表および ORDER_ITEMS 表が次のように定義されていると想定します。
CREATE TABLE ORDERS
  (ORDERNO     INTEGER NOT NULL,
   ORDER_DATE  DATE DEFAULT,
   CUSTNO      SMALLINT
   PRIMARY KEY (ORDERNO));

CREATE TABLE ORDER_ITEMS
  (ORDERNO     INTEGER NOT NULL,
   PARTNO      INTEGER NOT NULL,
   QUANTITY    SMALLINT NOT NULL,
   PRIMARY KEY (ORDERNO,PARTNO),
   CONSTRAINT REF_ORDERNO FOREIGN KEY (ORDERNO)
     REFERENCES ORDERS (ORDERNO) ON DELETE CASCADE);
ORDERS 表と ORDER_ITEMS 表の両方の キー値として使用する、ORDER_SEQ というシーケンスを作成します。
CREATE SEQUENCE ORDER_SEQ AS INTEGER
  START WITH 1
  INCREMENT BY 1
  NO MAXVALUE
  NO CYCLE
  CACHE 20;
続いて、同じシーケンス番号を ORDERS 表の主キー値として、さらに ORDER_ITEMS 表の主キー値の一部として使用できます。
INSERT INTO ORDERS (ORDERNO, CUSTNO)
  VALUES (NEXT VALUE FOR ORDER_SEQ, 12345);

INSERT INTO ORDER_ITEMS (ORDERNO, PARTNO, QUANTITY)
  VALUES (PREVIOUS VALUE FOR ORDER_SEQ, 987654, 2);
最初の INSERT ステートメントの NEXT VALUE 式は、 シーケンス・オブジェクト ORDER_SEQ のシーケンス番号値を生成します。 2 番目の INSERT ステートメントの PREVIOUS VALUE 式は、同じ値を取り出します。 その理由は、その値が現行アプリケーション処理範囲内でそのシーケンス・オブジェクトに対して最近生成された シーケンス番号であったからです。