SCOPE_IDENTITY() を使用して挿入された行の ID を取得する方法

2024-04-04

SQL Server で挿入された行の ID を取得する方法

SQL Server で INSERT ステートメントを使用して行を挿入した後、その行の ID を取得する必要がある場合があります。この ID は、多くの場合、主キーとして使用されます。

方法

挿入された行の ID を取得するには、次の 3 つの方法があります。

@@IDENTITY は、最後に挿入された行の ID を含む特殊な変数です。この変数は、INSERT ステートメントの後に使用できます。

INSERT INTO テーブル名 (列名) VALUES (値);

SELECT @@IDENTITY;
INSERT INTO テーブル名 (列名) VALUES (値);

SELECT SCOPE_IDENTITY();

OUTPUT 句は、INSERT ステートメントによって挿入された行のデータを取得するために使用できます。この句を使用すると、ID を含むすべての列を取得できます。

INSERT INTO テーブル名 (列名) VALUES (値)
OUTPUT INSERTED.列名;

次の例では、Customers テーブルに新しい顧客を挿入し、その ID を取得する方法を示します。

INSERT INTO Customers (FirstName, LastName) VALUES ('John', 'Doe');

-- @@IDENTITY を使用する
SELECT @@IDENTITY;

-- SCOPE_IDENTITY() を使用する
SELECT SCOPE_IDENTITY();

-- OUTPUT 句を使用する
INSERT INTO Customers (FirstName, LastName) VALUES ('Jane', 'Doe')
OUTPUT INSERTED.CustomerID;

注意事項

  • @@IDENTITY と SCOPE_IDENTITY() は、現在の接続スコープ内で最後に挿入された行の ID を返します。別の接続スコープで挿入された行の ID を取得するには、OUTPUT 句を使用する必要があります。
  • @@IDENTITY と SCOPE_IDENTITY() は、IDENTITY 列を持つテーブルにのみ使用できます。



-- テーブル作成
CREATE TABLE Customers (
  CustomerID int IDENTITY(1, 1) PRIMARY KEY,
  FirstName varchar(50) NOT NULL,
  LastName varchar(50) NOT NULL
);

-- @@IDENTITY を使用する
INSERT INTO Customers (FirstName, LastName) VALUES ('John', 'Doe');

SELECT @@IDENTITY;

-- SCOPE_IDENTITY() を使用する
INSERT INTO Customers (FirstName, LastName) VALUES ('Jane', 'Doe');

SELECT SCOPE_IDENTITY();

-- OUTPUT 句を使用する
INSERT INTO Customers (FirstName, LastName) VALUES ('Peter', 'Smith')
OUTPUT INSERTED.CustomerID;

このコードを実行すると、次の結果が表示されます。

1
2
3
  • @@IDENTITY、SCOPE_IDENTITY()、および OUTPUT 句の詳細については、Microsoft Docs を参照してください。
  • 上記のサンプルコードは、SQL Server 2019 でテストされています。



他の方法

トリガーを使用する

トリガーは、データ操作言語 (DML) ステートメントが実行されたときに実行される特殊なストアドプロシージャです。挿入された行の ID を取得するには、INSERT トリガーを作成できます。

IDENTITY 関数は、シーケンスの次の値を返します。この関数は、INSERT ステートメントの前に使用して、挿入される行の ID を事前に取得できます。

CREATE TRIGGER trg_Customers_Insert
ON Customers
AFTER INSERT
AS
BEGIN
  SELECT @@IDENTITY;
END;

INSERT INTO Customers (FirstName, LastName) VALUES ('John', 'Doe');

このコードを実行すると、トリガーが実行され、挿入された行の ID が出力されます。

  • トリガーは、複雑なコードになる可能性があります。
  • INSERTED 仮想テーブルは、SQL Server 2008 以降でのみ使用できます。

sql sql-server t-sql


SQL Server Audit vs サードパーティ製ツール:監査ソリューションの選び方

この文書では、SQL Serverで監査テーブルを実装するためのいくつかの提案を紹介します。監査には、次の2種類があります。データ監査: データベース内のデータに対する変更を追跡します。監査テーブルには、以下の情報を含める必要があります。変更されたテーブル名...


SQL Serverでエイリアス列のGROUP BYを実行する方法:4つの基本的な方法

SELECTステートメントでエイリアス列を使用した場合、GROUP BY句でそのエイリアス列を直接参照できない場合があります。解決策:以下の方法でエイリアス列のGROUP BYを実行できます。列名の代わりに式を使用する:WITH句を使用する:...


SELECT DISTINCT、GROUP BY、JOIN、サブクエリ…MySQLで同じ値を持つ行を見つけるための全テクニック

MySQLデータベースで、特定の列において同じ値を持つ行を見つけることは、データ分析や重複排除など様々な場面で必要となります。ここでは、その方法についていくつかご紹介します。方法SELECT DISTINCT は、指定された列の重複する値を除いて結果を返すクエリです。例えば、customers テーブルの name 列に重複する値がある場合、上記のクエリは重複する名前を除いてすべて表示します。...


SQLとPostgreSQL:information_schemaを使用してカスタム型を効率的にリストする

PostgreSQLクライアントに接続します。以下のSQLクエリを実行します。このクエリは、information_schema. typesテーブルからすべての行を返し、typetype列の値がcである行のみをフィルタリングします。 typetype列の値がcである行は、すべてカスタム型を表します。...


psqlで「invalid command \N while restore sql」エラーが発生時の解決方法

psqlを使用してPostgreSQLデータベースを復元しようとすると、「invalid command \N while restore sql」というエラーが発生することがあります。これは、ダンプファイルに\Nという特殊文字が含まれていることが原因です。...