0

私はテーブルの主キーとして Oracle シーケンスを使用し、この主キーをマッピングする Java アプリケーションで int を使用しました。顧客がテーブルの最大 int に達していることがわかりました。シーケンスは連続的に増加する可能性があります。しかし、Java int はそれを格納できなくなりました。非常に大きなコストがかかるため、Java コードを int から long に変更したくありません。次に、顧客DBのID列に大きなギャップがたくさんあることがわかりました。これらの不足している ID 番号を再利用する方法はありますか?

DB レベルでこれを行うことができれば、このシーケンスを再編成してこれらの不足している番号を追加できるので、Java コードを変更せずにこれらのギャップを使用できます。それは素晴らしいはずです。

これらの数値を取得した後、ギャップ範囲を見つける関数を作成します。できれば、それらをシーケンス値のプールに割り当てたいので、今後は自動インクリメントを使用せず、数値を使用するだけです割り当てられます。Java コードでは、引き続き findNextNumber を使用してシーケンスを呼び出すことができます。しかし、シーケンスは割り当てた値を返すことができます。無理そうですよね?代替手段はありますか?

4

2 に答える 2

3

つまり、シーケンスが「ギャップ」範囲内の値を返すことはありますか? 何らかの理由でドロップ/再作成しない限り、そうは思いません。テーブル内の PK ギャップを見つける何らかの関数を記述し、それらのギャップ範囲を別のテーブルに保存し、ギャップ テーブルを使用して独自のシーケンス関数を「ロール」することができると思います。非常に醜い。これらのギャップを「回復」しようとすることは、避けられないことを回避するための必死の試みのように聞こえます-Java PK データ型は DB データ型と一致している必要があります。クラスキーが16ビット整数として定義され、シーケンスが32Kを超えたVBアプリでずっと前に同じ問題があり、変数をLongに変更する必要がありました。私は言います、弾丸をかみ、変換を行います。今少しの痛みがあれば、後で続く痛みを大幅に軽減できます。私の意見です。

于 2013-03-09T16:07:16.120 に答える
0

より長い数を使用できるように変更することは間違いありませんが、それまでの間、負の数を生成するシーケンスを使用して、その変更を行うことができるようになるまで管理することができます。PK インデックスの維持にパフォーマンスへの影響があり、不釣り合いに速く大きくなりますが、

于 2013-03-10T11:49:32.693 に答える