SET IDENTITY_INSERT (Transact-SQL)
適用対象: SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
テーブルの ID 列に明示的な値を追加することを許可します。
構文
SET IDENTITY_INSERT [ [ database_name . ] schema_name . ] table_name { ON | OFF }
Note
SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。
引数
database_name
指定したテーブルが含まれているデータベースの名前を指定します。
schema_name
テーブルが所属するスキーマの名前を指定します。
table_name
ID 列があるテーブルの名前です。
解説
いかなる場合も、IDENTITY_INSERT プロパティを ON に設定できるのはセッション内の 1 つのテーブルのみです。 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 tool table.
CREATE TABLE dbo.Tool(
ID INT IDENTITY NOT NULL PRIMARY KEY,
Name VARCHAR(40) NOT NULL
);
GO
-- Inserting values into products table.
INSERT INTO dbo.Tool(Name)
VALUES ('Screwdriver')
, ('Hammer')
, ('Saw')
, ('Shovel');
GO
-- Create a gap in the identity values.
DELETE dbo.Tool
WHERE Name = 'Saw';
GO
SELECT *
FROM dbo.Tool;
GO
-- Try to insert an explicit ID value of 3;
-- should return an error:
-- 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.
INSERT INTO dbo.Tool (ID, Name) VALUES (3, 'Garden shovel');
GO
-- SET IDENTITY_INSERT to ON.
SET IDENTITY_INSERT dbo.Tool ON;
GO
-- Try to insert an explicit ID value of 3.
INSERT INTO dbo.Tool (ID, Name) VALUES (3, 'Garden shovel');
GO
SELECT *
FROM dbo.Tool;
GO
-- Drop products table.
DROP TABLE dbo.Tool;
GO
参照
CREATE TABLE (Transact-SQL)
IDENTITY (プロパティ) (Transact-SQL)
SCOPE_IDENTITY (Transact-SQL)
INSERT (Transact-SQL)
SET ステートメント (Transact-SQL)