順序の作成と使用

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

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

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

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

このシーケンスは、開始値 500で定義され、使用するたびに 1 ずつ増分され、最大値に達したときにリサイクルされません。 この例では、順序の最大値は 1000 です。 1000 が生成されると、追加の値を指定することはできず、エラーが発行されます。

一度この順序が作成されると、順序を使用して列に値を挿入できます。 例えば、 順序 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 文節にある式の副選択の選択文節 では 指定できません。
CREATE SEQUENCE ステートメントは、生成されるオブジェクトの IBM® i システム名を定義する方法を提供します。 シーケンスの名前が 10 文字より長い場合は、 FOR SYSTEM NAME 節を使用して、オブジェクトに割り当てられるシステム名を指定します。 この例は、 CREATE SEQUENCE ステートメントに指定されている両方の名前を示しています。 いずれかの名前は、 SQL ステートメント内のシーケンスを参照するときに使用できます。
CREATE SEQUENCE ORDER_SEQUENCE FOR SYSTEM NAME ORDER_SEQ
START WITH 500
INCREMENT BY 1
MAXVALUE 1000
NOCYCLE
CACHE 24;

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 です。