次の方法で共有


SET IDENTITY_INSERT (Transact-SQL)

適用対象:SQL ServerAzure SQL データベースAzure SQL Managed InstanceAzure Synapse Analytics

テーブルの ID 列に明示的な値を追加することを許可します。

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 は、SET IDENTITY_INSERT が既に ONされていることを示すエラー メッセージを返し、ON が設定されているテーブルを報告します。

挿入する値がテーブルの現在の ID 値よりも大きい場合、SQL Server では新しく挿入された値が現在の ID 値として自動的に使用されます。

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