最後のIDENTITY値を取得! @@IDENTITY、SCOPE_IDENTITY()、IDENT_CURRENT() の使い分け

2024-04-02

SQL Server の SCOPE_IDENTITY(), IDENTITY(), @@IDENTITY, IDENT_CURRENT() の違い

@@IDENTITY

@@IDENTITY は、現在のセッションで最後に挿入された IDENTITY 値を取得します。これは、どのスコープで挿入された値でも取得できます。

例:

USE TestDB;
GO

CREATE TABLE MyTable (
  ID INT IDENTITY(1,1),
  Name VARCHAR(50)
);
GO

INSERT INTO MyTable (Name) VALUES ('Test1');
SELECT @@IDENTITY;

-- 結果: 1

INSERT INTO MyTable (Name) VALUES ('Test2');
SELECT @@IDENTITY;

-- 結果: 2

SCOPE_IDENTITY()

USE TestDB;
GO

CREATE TABLE MyTable (
  ID INT IDENTITY(1,1),
  Name VARCHAR(50)
);
GO

CREATE TRIGGER MyTrigger ON MyTable
AFTER INSERT
AS
BEGIN
  INSERT INTO MyTable (Name) VALUES ('TriggerInserted');
END;
GO

INSERT INTO MyTable (Name) VALUES ('Test1');
SELECT SCOPE_IDENTITY();

-- 結果: 1

INSERT INTO MyTable (Name) VALUES ('Test2');
SELECT SCOPE_IDENTITY();

-- 結果: 2

-- トリガーによって挿入されたレコードの ID
SELECT ID FROM MyTable WHERE Name = 'TriggerInserted';

-- 結果: 3

IDENT_CURRENT()

USE TestDB;
GO

CREATE TABLE MyTable (
  ID INT IDENTITY(1,1),
  Name VARCHAR(50)
);
GO

CREATE TRIGGER MyTrigger ON MyTable
AFTER INSERT
AS
BEGIN
  INSERT INTO MyTable (Name) VALUES ('TriggerInserted');
END;
GO

INSERT INTO MyTable (Name) VALUES ('Test1');
SELECT IDENT_CURRENT();

-- 結果: 1

INSERT INTO MyTable (Name) VALUES ('Test2');
SELECT IDENT_CURRENT();

-- 結果: 2

-- トリガーによって挿入されたレコードの ID
SELECT ID FROM MyTable WHERE Name = 'TriggerInserted';

-- 結果: 3

IDENTITY() は、SELECT INTO ステートメントで使用され、新しい行に挿入される IDENTITY 値を指定します。

USE TestDB;
GO

CREATE TABLE MyTable (
  ID INT IDENTITY(1,1),
  Name VARCHAR(50)
);
GO

DECLARE @NewID INT;

SELECT @NewID = IDENTITY(MyTable, ID);

INSERT INTO MyTable (Name) VALUES ('Test1');

SELECT ID FROM MyTable WHERE ID = @NewID;

-- 結果: 1
  • @@IDENTITY: 現在のセッションで最後に挿入された IDENTITY 値を取得

これらの違いを理解することで、目的の IDENTITY 値を正しく取得することができます。




USE TestDB;
GO

CREATE TABLE MyTable (
  ID INT IDENTITY(1,1),
  Name VARCHAR(50)
);
GO

-- @@IDENTITY

INSERT INTO MyTable (Name) VALUES ('Test1');
SELECT @@IDENTITY;

-- 結果: 1

-- SCOPE_IDENTITY()

BEGIN TRAN
  INSERT INTO MyTable (Name) VALUES ('Test2');
  SELECT SCOPE_IDENTITY();
ROLLBACK TRAN;

-- 結果: 2

-- IDENT_CURRENT()

INSERT INTO MyTable (Name) VALUES ('Test3');
SELECT IDENT_CURRENT();

-- 結果: 3

-- IDENTITY()

DECLARE @NewID INT;

SELECT @NewID = IDENTITY(MyTable, ID);

INSERT INTO MyTable (Name) VALUES ('Test4');

SELECT ID FROM MyTable WHERE ID = @NewID;

-- 結果: 4

このコードを実行することで、@@IDENTITY, SCOPE_IDENTITY(), IDENT_CURRENT(), IDENTITY() のそれぞれの動作を確認することができます。




OUTPUT 句を使用して、挿入された行の列値を取得することができます。

USE TestDB;
GO

CREATE TABLE MyTable (
  ID INT IDENTITY(1,1),
  Name VARCHAR(50)
);
GO

INSERT INTO MyTable (Name) VALUES ('Test1')
OUTPUT INSERTED.ID;

-- 結果: 1
USE TestDB;
GO

CREATE TABLE MyTable (
  ID INT IDENTITY(1,1),
  Name VARCHAR(50)
);
GO

INSERT INTO MyTable (Name) VALUES ('Test1');

SELECT ID FROM INSERTED;

-- 結果: 1
USE TestDB;
GO

CREATE TABLE MyTable (
  ID INT IDENTITY(1,1),
  Name VARCHAR(50)
);
GO

CREATE TRIGGER MyTrigger ON MyTable
AFTER INSERT
AS
BEGIN
  DECLARE @ID INT;

  SELECT @ID = ID FROM INSERTED;

  -- ここに @ID を使用して処理を行う
END;
GO

INSERT INTO MyTable (Name) VALUES ('Test1');

-- ここに処理が実行される

sql sql-server identity


もう迷わない!SQLで時間間隔の重複を効率的に見つける5つの方法とサンプルコード

以下の表のような時間間隔を持つ行データにおいて、重複する行を見つける方法について解説します。解決策:以下の2つの方法を紹介します。方法1:JOINとCASE式重複判定には、CASE式を用いて、以下の条件を判断します。 2つの行の開始時刻が同じ 2つの行の開始時刻と終了時刻が異なるが、片方の行の開始時刻がもう片方の行の終了時刻よりも早い...


MDFファイルの奥深さを探求!SQL Serverデータベースの基礎知識から応用まで

MDFファイルの正体:データベースの主要データを収容MDFファイルは、主に以下の重要な情報を含むデータベースの主要なデータを格納します。テーブルとインデックス: データを整理して格納するテーブルと、効率的なデータ検索を可能にするインデックス...


迷ったらコレ!MySQLにおける外部キー制約のON UPDATEとON DELETEオプションの使い分け

MySQLで外部キー制約を使用する際、ON UPDATEとON DELETEオプションは、親テーブルのデータ更新・削除時の関連テーブルのデータ処理方法を指定します。適切なオプションを選択することで、データ整合性を維持し、予期せぬデータ損失を防ぐことができます。...


【Mariadbチュートリアル】SQLで複数値フィールドからデータを抽出する方法

このチュートリアルでは、Mariadb を使用して、複数値フィールド からデータを抽出する方法について説明します。 複数値フィールドは、1 つのレコードに複数の値を格納できる特殊なデータ型です。 これは、顧客の興味、製品のカテゴリ、タグなど、さまざまなユースケースに役立ちます。...


SQL SQL SQL SQL Amazon で見る



SQL Server で @@IDENTITY, SCOPE_IDENTITY(), OUTPUT およびその他の方法を使用して最後の ID を取得する方法

SQL Server で INSERT ステートメントを実行した後、IDENTITY 列の最後の値を取得する必要がある場合があります。 これは、新しい行の関連 ID を取得したり、後続の INSERT ステートメントで使用するために最後の ID を保存したりするために行うことができます。