1

私は Visual Studio - VB.NET で作業しています。

私の問題は、SQL Server の特定の行を削除したいのですが、私が持っている唯一の一意の列は、自動的にインクリメントされる ID だけです。

私の作業手順:
1. 列に行を追加します (ID は増分されますが、番号はわかりません)
2. 前の行を削除したい

すべての新しいレコードに固有の ID のようなものはありますか? 私のテーブルにはまったく同じレコードが 2 つある可能性がありますが、シーケンス (ID) が異なるだけです。

この問題を処理する方法はありますか?

4

2 に答える 2

6

SQL Serverには、最後の行に対して生成された ID を返すいくつかの関数があり、それぞれに固有の長所と短所があります。

基本的:

  • @@IDENTITYトリガーを使用しない場合に機能します
  • SCOPE_IDENTITY()明示的に呼び出したコードに対して機能します。
  • IDENT_CURRENT(‘tablename’)すべてのスコープにわたって、特定のテーブルに対して機能します。

ほとんどすべてのシナリオSCOPE_IDENTITY()で必要なものであり、他のオプションとは対照的に、これを使用するのは良い習慣です。
アプローチの長所と短所に関する良い議論もここで入手できます。

于 2013-01-08T08:42:38.487 に答える
3

前の行を削除したい

そしてそれがあなたの問題です。SQLには、「前の行」のような概念はありません。前の単語は順序を意味し、順序はクエリにのみ適用され、ORDERBY句を追加することで実現されます。テーブルには順序がありません。これは、「<this>条件を満たすレコードを削除する必要がある」という意味で言い換える必要があります。これは衒学的なジブリッシュのように聞こえるかもしれませんが、問題を認めるまで解決策を見つけることはできません。

挿入されたID列の値を解釈する方法を検索し、そこから1を引くと、多くの多くの問題が発生します。並行性の下では正しくありません。ロールバックがある場合は正しくありません。ETLジョブの後で正しくありません。全体として、単調に増加するIDを期待することは決してありません。それらは自由にギャップをジャンプでき、ギャップが存在する場合はコードが正しいはずです。

于 2013-01-08T10:15:40.337 に答える