1

テーブルがMS SQL SERVER 2008あり、自動的にインクリメントするように設定しましprimary keyたが、このテーブルから行を削除してテーブルに新しい行を挿入すると、ID 値にギャップが生じた次の ID 値から開始されます。私のプログラムでは、すべての ID またはキーが順番に並んでいる必要があります。

のように:割り当てテーブルには、シーケンス ID (1-16) を持つ合計 16 行がありますが、16 番目の位置の値を削除すると

Delete From Assignment Where assignment_id=16; 

この操作の後、新しい行を挿入すると

Insert  into Assignment(assignment_title)Values('myassignment');

この新しい値に主キーとして 16 を割り当てるのではなく、17 を割り当てます。

この問題を解決するにはどうすればよいですか?

4

4 に答える 4

3

主キー値の名前変更または再番号付けは、適切なデータベース管理方法ではありません。主キーをそのままにして、番号を付け直す必要がある値で別の列インデックスを作成することをお勧めします。次に、「ギャップ」を探して、以前の値からインクリメントされた値を入力することにより、期待する順序ですべての行に番号を付け直すルーチンを実行するトリガーを作成します。

于 2013-06-17T06:09:03.577 に答える
0

行の番号を付け直す後処理ロジックがなければ、希望する動作は実現できません。

したがって、次のシナリオを検討してください。

セッション 1 はトランザクションを開始し、行 (id=16) を挿入しますが、まだコミットしていません。

セッション 2 はトランザクションを開始し、行 (id=17) を挿入してコミットします。

セッション 1 はロールバックします。

16 がテーブルに存在するかどうかは、17 がコミットされた後に決定されます。

また、トリガーでこれらの番号を付け直すことはできません。デッドロックが発生します。

おそらく行う必要があるのは、連続する整数である行番号を追加してデータをクエリすることです。

ID 値のギャップは問題にならない

于 2013-06-17T06:54:32.100 に答える
0

最近、同じ問題に直面しました。ID とまったく同じ名前のファイルを取得するには、外部 C# アプリケーションで ID 値が必要です。==> ID プロパティを回避するために行ったことは次のとおりです。小さなテーブルだったので手動で id 値を入力しましたが、そうでない場合は、SEQUENCE SQL Server 2014 を使用してください。delete の代わりに UPDATE ステートメントを使用してください。 ID値を順番に保ちます。

于 2016-11-15T12:53:07.617 に答える
0

これは SQL Server の標準的な動作です。この例で ID=8 の行を削除しても、まだギャップがあります。

あなたができることは、すべての挿入に対して呼び出し、割り当てられていない最小の ID を取得する関数 getSmallestDreeID を SQL Server に記述することだけです。ただし、トランザクションと ACID には細心の注意を払う必要があります。

于 2013-06-17T06:06:08.667 に答える