SET IDENTITY_INSERT (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsMicrosoft Fabric SQL Database

この文を使うことで、テーブルの IDENTITY 列に明示的な値を挿入できます。

Transact-SQL 構文表記規則

構文

SET IDENTITY_INSERT [ [ database_name . ] schema_name . ] table_name { ON | OFF }

引数

database_name

指定されたテーブルが存在するデータベース名。

schema_name

テーブルを含むスキーマの名前。

table_name

ID 列を持つテーブルの名前。

解説

IDENTITY_INSERT プロパティを ONに設定できるのは、セッション内のテーブルが 1 つだけです。 もしテーブルにすでにこのプロパティがONに設定されていて、別のテーブルに対してSET IDENTITY_INSERT ON文を発行すると、SQL ServerはすでにONSET IDENTITY_INSERTとエラーメッセージを返し、ONが設定されているテーブルを報告します。

  • IDENTITY関数increment引数が正で、挿入された値がテーブルの現在の識別子値より大きい場合、SQL データベース エンジンは自動的に新たに挿入された値を現在の識別子として使用します。
  • IDENTITY関数increment引数が負で、挿入された値がテーブルの現在の恒等元値より小さい場合、SQL Server自動的に新たに挿入された値を現在の恒等元値として使用します。

SET IDENTITY_INSERT の設定は、解析時ではなく実行時に設定されます。

アクセス許可

テーブルの所有者か、テーブル ALTER 許可が必要です。

次の例では、ID 列を含むテーブルを作成した後、SET IDENTITY_INSERT ステートメントによって ID 値に発生したギャップを、DELETE の設定を使用して調整しています。

USE AdventureWorks2022;
GO

ツール テーブルを作成します。

CREATE TABLE dbo.Tool
(
    ID INT IDENTITY NOT NULL PRIMARY KEY,
    Name VARCHAR (40) NOT NULL
);
GO

products テーブルに値を挿入します。

INSERT INTO dbo.Tool (Name)
VALUES ('Screwdriver'),
    ('Hammer'),
    ('Saw'),
    ('Shovel');
GO

ID 値にギャップを作成します。

DELETE dbo.Tool
WHERE Name = 'Saw';
GO

SELECT *
FROM dbo.Tool;
GO

明示的な ID 値 3 を挿入してみてください。

INSERT INTO dbo.Tool (ID, Name)
VALUES (3, 'Garden shovel');
GO

前の INSERT コードは以下のエラーを返します:

An explicit value for the identity column in table 'AdventureWorks2022.dbo.Tool' can only be specified when a column list is used and IDENTITY_INSERT is ON.

IDENTITY_INSERTONに設定します。

SET IDENTITY_INSERT dbo.Tool ON;
GO

明示的な ID 値 3 を挿入してみてください。

INSERT INTO dbo.Tool (ID, Name)
VALUES (3, 'Garden shovel');
GO

SELECT *
FROM dbo.Tool;
GO

ツール テーブルを削除します。

DROP TABLE dbo.Tool;
GO