これは、サイズに関係なく、多くの開発者やアプリケーションで依然として非常に一般的な問題です。
残念ながら、上記の提案はすべてのシナリオ、つまり共有ホスティングを修正するわけではありません。ホストに依存して-t272起動パラメーターを設定することはできません。
また、これらのID列を主キーに使用する既存のテーブルがある場合、それらの列を削除し、新しい列を再作成してBSシーケンスの回避策を使用するのは非常に困難です。シーケンスの回避策は、SQL 2012+で最初からテーブルを新しく設計する場合にのみ有効です。
結論としては、SQL Server 2008R2を使用している場合はそのままにしておきます。真剣に、それにとどまります。Sql Server 2016にも存在する巨大なバグが導入されたことをマイクロソフトが認めるまでは、Microsoftが所有して修正するまでアップグレードしないでください。
Microsoftはまっすぐに重大な変更を導入しました。つまり、システムが再起動時に現在のIDを忘れてしまうため、設計どおりに機能しないAPIが機能しなくなりました。キャッシュまたはキャッシュなし。これは受け入れられません。ブライアンという名前のMicrosoft開発者は、「仕様による」「機能」であることを世界に知らせる代わりに、それを所有する必要があります。確かに、キャッシングは機能ですが、次のIDが何であるかを追跡することは機能ではありません。とんでもないバグです!!!
私のDBは共有ホスティングサーバー上にあるため、使用した回避策を共有します。また、主キー列を削除して再作成しないため、巨大なPITAになります。
代わりに、これは私の恥ずべきハックです(ただし、マイクロソフトが導入したこのPOSバグほど恥ずべきではありません)。
ハック/修正:
挿入コマンドの前に、各挿入の前にIDを再シードします。この修正は、SQL Serverインスタンスの管理者権限がない場合にのみお勧めします。それ以外の場合は、サーバーの再起動時に再シードすることをお勧めします。
declare @newId int -- where int is the datatype of your PKey or Id column
select @newId = max(YourBuggedIdColumn) from YOUR_TABLE_NAME
DBCC CheckIdent('YOUR_TABLE_NAME', RESEED, @newId)
挿入する直前の3行だけで十分です。パフォーマンスにはそれほど影響しません。つまり、目立たなくなります。
幸運を。
order by ReceiptNo
クエリに追加すると、それらのレコードは実際には存在しませんか?レコードが挿入されているときにエラーは発生しませんか?レコードが挿入されようとして失敗した場合、IDは増加します。レコードが削除された場合も同様です。レコードが削除されてReceiptNo
もリセットされません。テーブルの作成テーブルを投稿できますFee
か?