SQL Server の @@IDENTITY
、SCOPE_IDENTITY()
、IDENT_CURRENT()
、IDENTITY()
関数についての深い理解
SQL データベース プログラミングでは、最後に挿入された ID 値を取得することが重要なタスクです。この目的のためにさまざまな関数が提供されており、それぞれに独自のニュアンスがあります。 SCOPE_IDENTITY()
、IDENTITY()
、@@IDENTITY
、IDENT_CURRENT()
は最も一般的に使用される関数の一部ですが、これらの違いが混乱を招く可能性があります。
スコープの理解
これらの機能の違いを理解するには、「スコープ」の概念を理解することが重要です。 SQL では、スコープとは、クエリまたはコードのブロックが実行されるレベルを指します。 2 つの主なスコープがあります:
機能の違い
スコープと機能に基づいて、各機能の内訳は次のとおりです。
@@IDENTITY
: 同じセッションで作成された最後の ID 値を返します。この関数はクエリやストアド プロシージャのスコープに依存せず、通常はグローバル ID 値を取得するために使用されます。 SCOPE_IDENTITY()
: 同じセッションおよびスコープ内で作成された最後の ID 値を返します。 @@IDENTITY
とは異なり、この関数は現在のクエリまたはストアド プロシージャのコンテキストのみを考慮します。 IDENT_CURRENT(name)
: セッションやクエリのスコープに関係なく、特定のテーブルまたはビューに対して作成された最後の ID 値を返します。この関数を使用すると、さまざまなクエリやセッションにわたって ID 値を取得できます。 IDENTITY()
: 他の 3 つの関数とは異なり、IDENTITY()
は主に SELECT...INTO
クエリで ID 値を生成するために使用されます。既存の ID 値は取得されません。 使用シナリオ
これらの違いを説明するために、次のシナリオを考えてみましょう:
@@IDENTITY
を使用してそれを取得します。 <code class="language-sql">INSERT INTO MyTable (Name) OUTPUT INSERTED.ID INTO @Identity; PRINT @Identity; -- 打印全局插入的标识值</code>
MyTable
にトリガーを作成して、別のテーブルにレコードを挿入し、両方のテーブルから ID 値を取得します。 <code class="language-sql">CREATE TRIGGER MyTrigger ON MyTable AFTER INSERT AS INSERT INTO OtherTable (Name) VALUES (NEW.Name); INSERT INTO MyTable (Name) VALUES ('Test'); SELECT @@identity AS MyIdentity; -- 打印在MyTable中插入的标识值 SELECT scope_identity() AS TriggerIdentity; -- 打印触发器在OtherTable中插入的标识值</code>
これらのシナリオでは、トリガーの関与により、@@IDENTITY
と SCOPE_IDENTITY()
は異なる動作をします。
ベスト プラクティスの提案
ほとんどの場合、最後に作成された ID 値を取得するには、SCOPE_IDENTITY()
が推奨される関数です。現在のクエリまたはストアド プロシージャ内で最も信頼性が高くコンテキストに応じた値を提供します。ただし、別のスコープまたはセッションで ID 値を取得する必要がある場合は、IDENT_CURRENT(name)
がその機能を提供します。
以上がSQL Server の `@@IDENTITY`、`SCOPE_IDENTITY()`、`IDENT_CURRENT()`、および `IDENTITY()` の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。