順序の作成と使用

順序は、どちらも固有値を生成するという点で識別列と同じです。 しかし、順序は表から独立したオブジェクトです。順序を使用すると、値を素早く簡単に生成できます。

順序は、表内の列には結合されておらず、別個にアクセスされます。さらに、順序はトランザクションの作業単位の一部としては扱われません。

CREATE SEQUENCE ステートメントを使用して順序を作成します。 例えば、識別列の例と同様に、順序 ORDER_SEQ を作成します。

CREATE SEQUENCE ORDER_SEQ
START WITH 500
INCREMENT BY 1
MAXVALUE 1000
CYCLE
CACHE 24

この順序は、開始値 500 で定義され、使用されるたびに 1 ずつ増分され、 最大値に達した場合はリサイクルされます。 この例では、順序の最大値は 1000 です。 この値が 1000 に達したら、もう一度 500 から再開されます。

一度この順序が作成されると、順序を使用して列に値を挿入できます。 例えば、 順序 ORDER_SEQ の次の値を表 ORDERS の列 ORDERNO と CUSTNO に挿入します。

まず、表 ORDERS を作成します。

CREATE TABLE ORDERS
(ORDERNO SMALLINT NOT NULL,
CUSTNO SMALLINT);

次に、順序の値を挿入します。

INSERT INTO ORDERS (ORDERNO, CUSTNO)
VALUES (NEXT VALUE FOR ORDER_SEQ, 12)

以下のステートメントを実行すると、列の値を戻します。

SELECT * 
FROM ORDERS
表 1. 表 ORDERS からの SELECT の結果
ORDERNO CUSTNO
500 12

この例では、順序 ORDER の次の値が ORDERNO 列に挿入されます。 INSERT ステートメントをもう一度発行します。 その後で、SELECT ステートメントを実行します。

表 2. 表 ORDERS からの SELECT の結果
ORDERNO CUSTNO
500 12
501 12

PREVIOUS VALUE 式を使用して、順序 ORDER の前の値を挿入することもできます。 以下の式で NEXT VALUE および PREVIOUS VALUE を使用できます。

  • ステートメントに DISTINCT キーワード、GROUP BY 文節、 ORDER BY 文節、UNION キーワード、 INTERSECT キーワード、または EXCEPT キーワードが含まれていない場合、 SELECT ステートメントまたは SELECT INTO ステートメントの選択文節
  • INSERT ステートメントの VALUES 文節内
  • INSERT ステートメントの全選択の選択文節
  • 検索または配置された UPDATE ステートメントの SET 文節内。 しかし、NEXT VALUE は SET 文節にある式の副選択の選択文節 では 指定できません。

ALTER SEQUENCE ステートメントを発行することによって順序を変更できます。 順序は、以下の方法で変更できます。

  • 順序の再始動
  • 今後の順序値の増分の変更
  • 最小値または最大値の設定または除去
  • キャッシュ付き順序番号の数の変更
  • 順序が循環できるかどうかを判別する属性の変更
  • 要求の順に順序番号を生成しなければならないかどうかの変更

例えば、順序 ORDER の値の増分を 1 から 5 に変更するには:

ALTER SEQUENCE ORDER_SEQ
INCREMENT BY 5

この変更が完了した後、INSERT ステートメントをもう一度実行し、その後に SELECT ステートメントを実行します。表には以下の列が含まれています。

表 3. 表 ORDERS からの SELECT の結果
ORDERNO CUSTNO
500 12
501 12
528 12

順序が使用する次の値が 528 であることに注意してください。 一見すると、この数は誤りであるかに見えます。 しかし、この割り当てに至る事象をご覧ください。 まず、順序が最初に作成されたとき、キャッシュ値 24 が割り当てられました。 システムはこのキャッシュの最初の 24 の値を割り当てます。 次に、順序は変更されました。 ALTER SEQUENCE ステートメントが発行されたとき、システムは割り当てられた値を除去し、次の有効値を使用して再始動します。 この場合、キャッシュされた元の 24 に、次の増分 5 が足されます。 元の CREATE SEQUENCE ステートメントに CACHE 文節がない場合、システムは自動的にデフォルトのキャッシュ値である 20 を割り当てます。 順序が変更された場合、次の有効値は 25 です。