1

INT主キー列を持つテーブルがあります。GUIDorIDENTITYを主キーとして使用したくありません。

テーブルの主キー列としてIDENTITYorを使用せずに次の ID を取得する最善の方法を知りたいと思いました。主キー列でない限り、テーブルでorGUIDを使用してもかまいません。GUIDIDENTITY

次に利用可能なものを見つけてID(つまり、MAX ID を取得して 1 ずつ増やして)、それを使用する必要があります。

SELECT @id=ISNULL(max(AlbumId)+1,1) FROM Albums

ただし、問題が発生しないように、これを行っているときに他のアプリケーションがテーブルに挿入されないようにしたいと考えています。

注: この質問をDUPLICATEとしてマークしないでください。私はこの答えを見てきましたが、正しく理解できませんでした。彼らが何をしているのかを説明してくれる親切な人はいますか?また、同じテクニックを使用できますか?

4

1 に答える 1

6

SQL Server 2000-2008 R2の場合、使用するのINT IDENTITYはるか簡単で信頼性の高い方法です。

これを自分でやろうとすることは、車輪の再発明のようなものであり、それがうまくいかない可能性のある多くの方法をもたらします-それで、なぜわざわざ?? (a)このメカニズムが並行性に対して安全であることを確認する必要があり(そして実行するだけでは安全SELECT MAX(ID) + 1ではありません!)、(b)メカニズムがシステムパフォーマンスの主要なボトルネックにならないようにする必要があります...

INT IDENTITY主キーとして使用する際の問題は何ですか?あまり合理的ではないようです...

SQL Server 2012SEQUENCE以降の場合は、 (基本的にIDENTITY単一のテーブルに特に結合されていない)の使用を検討することもできます。

更新: あなたがあなたの投稿で言及している他のSOの質問SEQUENCEは、基本的に:の「日曜大工」シミュレーションを行っています。

  • sequencename, currentvalueテーブルは( )のペアを保持します
  • 特定のシーケンスの新しい値を要求すると、新しい値は、句と結合されたステートメントのみを使用して決定されます。UPDATEOUTPUT

なぜそんなに複雑なのですか?IDENTITYこれは、同時リクエストを安全に処理するための(を使用する以外の)最も簡単で効率的な方法です。このUPDATEステートメントは、常に、新しいシーケンスの「シーケンステーブル」内のその1つの行を排他的にロックします。これにより、他のトランザクションが同じ行を取得して重複した値を取得するIDのを防ぎ、句を使用して新しい行を返します。呼び出し側。IDIDOUTPUT

于 2012-12-05T15:32:26.043 に答える