順次値を生成することは、一般的なデータベース・アプリケーション開発の問題です。 この問題を解決する最善の方法は、SQL でシーケンス・オブジェクトとシーケンス式を 使用することです。 各シーケンス・オブジェクト は、 固有の名前が付けられたデータベース・オブジェクトであり、 シーケンス式によってのみアクセスできます。 シーケンス式 には、 PREVVAL 式と NEXTVAL 式の 2 つがあります。 PREVVAL 式は、前のステートメントに対して指定されたシーケンスについて 最後に生成された値を返します。 NEXTVAL シーケンス式は、シーケンス・オブジェクトの値を増やして、 そのシーケンス・オブジェクトの新しい値を返します。
シーケンス・オブジェクトを作成するには、CREATE SEQUENCE ステートメントを実行します。 たとえば、デフォルトの属性を使用して id_values というシーケンス・オブジェクトを 作成するには、次のステートメントを実行します。
CREATE SEQUENCE id_values
シーケンス・オブジェクトの現行値を表示するには、 PREVVAL 式を使用して VALUES ステートメントを実行します。
VALUES PREVVAL FOR id_values 1----------- 1 1 レコードが選択されました。
シーケンス・オブジェクトの現行値は繰り返し検索することができます。 シーケンス・オブジェクトが返す値は、NEXTVAL 式を実行するまで変わりません。 以下の例では、NEXTVAL 式がシーケンス・オブジェクトの値を増やすまで、 PREVVAL は値 1 を返します。
VALUES PREVVAL FOR id_values 1----------- 1 1 レコードが選択されました。 VALUES PREVVAL FOR id_values 1----------- 1 1 レコードが選択されました。 VALUES NEXTVAL FOR id_values 1----------- 2 1 レコードが選択されました。 VALUES PREVVAL FOR id_values 1----------- 2 1 レコードが選択されました。
シーケンス・オブジェクトの 次の値で列の値を更新するには、次のように UPDATE ステートメントに NEXTVAL 式を組み込みます。
UPDATE staff SET id = NEXTVAL FOR id_values WHERE id = 350
シーケンス・オブジェクトの次の値を使用して 新しい行を表に挿入するには、次のように INSERT ステートメントに NEXTVAL 式を組み込みます。
INSERT INTO staff (id, name, dept, job) VALUES (NEXTVAL FOR id_values, 'Kandil', 51, 'Mgr')
PREVVAL 式と NEXTVAL 式について詳しくは、「SQL 解説書」を参照してください。
アプリケーションの要求を満たすようにシーケンス・オブジェクトの振る舞いを 調整することができます。 CREATE SEQUENCE ステートメントを実行して新しいシーケンス・オブジェクトを作成する場合、 および既存のシーケンス・オブジェクトに対して ALTER SEQUENCE を実行する場合は、 シーケンス・オブジェクトの属性を変更します。 指定可能なシーケンス・オブジェクトの属性のいくつかを以下に示します。
たとえば、開始値が 0、最大値が 1000、各 NEXTVAL 式での増分値が 2 で、 最大値に達したときに開始値に戻る id_values というシーケンス・オブジェクトを 作成するには、次のステートメントを実行します。
CREATE SEQUENCE id_values START WITH 0 INCREMENT BY 2 MAXVALUE 1000 CYCLE
CREATE SEQUENCE ステートメントと ALTER SEQUENCE ステートメントについて詳しくは、 「SQL 解説書」を参照してください。
識別列のように、シーケンス・オブジェクトを使用して値を生成する場合、 一般に、他の方法と比べてアプリケーションのパフォーマンスが向上します。 シーケンス・オブジェクトを制御する別の方法として、現行値を保管する単一列表を 作成し、トリガーを使用して、またはアプリケーションの制御下で、 その値を増やす方法があります。 単一列表にアプリケーションが並行してアクセスする分散環境では、 順番に表にアクセスすることを強制するために必要になるロックが、 パフォーマンスに大きく影響します。
シーケンス・オブジェクトは、単一列表を使用する方法に関連するロック発行を行わずに、 シーケンス値をメモリーにキャッシュして DB2 の応答時間を改善することができます。 シーケンス・オブジェクトを使用するアプリケーションのパフォーマンスを最大にするには、 シーケンス・オブジェクトが適切な量のシーケンス値を確実にキャッシュするようにします。 CREATE SEQUENCE ステートメントおよび ALTER SEQUENCE ステートメントの CACHE 文節は、 DB2 が生成してメモリーに保管するシーケンス値の最大数を指定します。
シーケンス・オブジェクトが順序正しく値を生成する必要があり、 システム障害またはデータベース非活動化でその順序が途切れないようにする場合、 ORDER および NO CACHE 文節を CREATE SEQUENCE ステートメントで使用します。 NO CACHE 文節は、生成された値が途切れないことを保証します。 この場合、シーケンス・オブジェクトが新しい値を生成するたびに データベース・ログに書き込むため、アプリケーションのパフォーマンスが低下します。
シーケンス・オブジェクトと識別列は DB2 アプリケーションに対して 同じような目的を果たすために使用されているように見えますが、 いくつかの重要な違いがあります。