質問
以前は、主キーの値の生成に「 GENERATED ALWAYS 」を使用していました。ただし、「GENERATED ALWAYS」を使用する代わりに、主キーの値を設定するためにシーケンスを使用することをお勧めします。この変更の理由は何だと思いますか?これは選択の問題ですか?
以前のコード:
CREATE TABLE SCH.TAB1
(TAB_P INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1, NO CACHE),
.
.
);
今は
CREATE TABLE SCH.TAB1
(TAB_P INTEGER ),
.
.
);
挿入中に、シーケンスを介してTAB_Pの値を生成します。
解決
シーケンスよりもID列を使用する傾向がありますが、この2つを比較します。
シーケンスは任意の目的で数値を生成できますが、ID列はテーブルの列に厳密に付加されます。
シーケンスは独立したオブジェクトであるため、複数のテーブル(またはその他)の番号を生成でき、テーブルが削除されても影響を受けません。 ID列を持つテーブルが削除されると、そのID列によって最後に割り当てられた値のメモリはありません。
テーブルには1つのID列しか設定できないため、同じテーブル内の異なる列に複数の連続番号を記録したい場合は、シーケンスオブジェクトで処理できます。
データベース内の連続番号ジェネレーターの最も一般的な要件は、技術キーを行に割り当てることです。これは、ID列によって適切に処理されます。より複雑な数値生成が必要な場合は、シーケンスオブジェクトを使用すると柔軟性が高まります。
他のヒント
これはおそらく、テーブルに多くの削除がある場合にIDを処理するためです。
例:IDの場合、IDが 1 2 3
レコード3を削除すると、テーブルは 1 2
そして、新しいレコードを挿入すると、IDは 1 2 4
これとは対照的に、ID列を使用せず、コードを使用してIDを生成している場合、新しい挿入の削除後にIDをmax(id)+ 1として計算できるため、IDは順序どおりになります 1 2 3
他の理由、つまりID列を使用しない理由は考えられません。
publibサイトで見つけたもの:
IDENTITY列とシーケンスの比較
IDENTITY列とシーケンスには類似点がありますが、違いもあります。データベースとアプリケーションを設計するときに、それぞれの特性を使用できます。
ID列には次の特性があります。
- ID列は次のように定義できます テーブルの一部のみ 創造された。テーブルが作成されたら、 変更して追加することはできません ID列。 (ただし、既存の ID列の特性は 変更されます。)
- ID列 の値を自動的に生成します 単一のテーブル。
- アイデンティティが 列はGENERATEDとして定義されています 常に、使用される値は常に データベースマネージャーによって生成されます。 アプリケーションは許可されていません 中に独自の値を提供します の内容の変更 テーブル。
シーケンスオブジェクトには次の特性があります。
- シーケンスオブジェクトはデータベースです いずれにも関連付けられていないオブジェクト テーブル。
- シーケンスオブジェクトが生成します で使用できる連続値 SQLまたはXQueryステートメント。
- シーケンスオブジェクトを使用できるため どのアプリケーションでも、2つあります 制御に使用される式 次の値の取得 指定されたシーケンスと値 ステートメントの前に生成された 実行されています。前の価値 式は最新のものを返します 指定した値に対して生成された値 前のステートメントのシーケンス 現在のセッション内。ネクスト VALUE式は次を返します 指定されたシーケンスの値。の これらの式を使用すると、 複数で使用される同じ値 内のSQLおよびXQueryステートメント いくつかのテーブル。
これらはこれら2つの項目のすべての特性ではありませんが、これらの特性は、データベース設計とデータベースを使用するアプリケーションに応じて、どちらを使用するかを決定するのに役立ちます。
シーケンスではなくID列を使用する理由がわからない。 シーケンスは同じことを達成し、はるかに簡単です。特に、他の環境へのデータのアンロードとロードを行う場合、ID列は非常に苦痛です。その情報はマニュアルに記載されているため、すべての違いについては説明しませんが、IDを持つテーブルが存在する場合、ユーザーが1つの環境から別の環境にデータを移行する場合は、常にDBAが関与する必要があることを伝えることができますユーザーが混乱する可能性があるためです。シーケンスを使用しても問題はありません。ユーザーは、必要に応じてシーケンスを変更できるように、スキーマオブジェクトを更新できます。