DB2自動生成列/ GENERATED ALWAYS賛否両論のシーケンス

StackOverflow https://stackoverflow.com/questions/1026936

  •  06-07-2019
  •  | 
  •  

質問

以前は、主キーの値の生成に「 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が関与する必要があることを伝えることができますユーザーが混乱する可能性があるためです。シーケンスを使用しても問題はありません。ユーザーは、必要に応じてシーケンスを変更できるように、スキーマオブジェクトを更新できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top