エラーメッセージ「Cannot insert explicit value for identity column in table 'table' when IDENTITY_INSERT is set to OFF」の解決方法

2024-04-02

エラーメッセージ「Cannot insert explicit value for identity column in table 'table' when IDENTITY_INSERT is set to OFF」の解説

原因

IDENTITY カラムは、自動的に一意の値を生成するように設定されています。そのため、通常は明示的な値を挿入する必要はありません。

IDENTITY_INSERT プロパティは、IDENTITY カラムに明示的な値を挿入することを許可するかどうかを制御します。このプロパティが OFF になっている場合、IDENTITY カラムに明示的な値を挿入することはできません。

解決方法

このエラーメッセージを解決するには、以下の方法があります。

IDENTITY_INSERT プロパティを ON にする

SET IDENTITY_INSERT table ON;

INSERT INTO table (id, name) VALUES (1, 'John Doe');

SET IDENTITY_INSERT table OFF;

IDENTITY カラムに明示的な値を挿入しない

INSERT INTO table (name) VALUES ('John Doe');

IDENTITY カラムを自動生成しないようにする

CREATE TABLE table (
  id INT NOT NULL,
  name VARCHAR(50)
);

補足

  • IDENTITY_INSERT プロパティは、テーブルごとに設定する必要があります。
  • IDENTITY_INSERT プロパティを ON に設定すると、IDENTITY カラムに重複する値を挿入できるようになります。

このエラーメッセージに関する情報は、以下のサイトでも確認できます。




USE AdventureWorks2019;

-- IDENTITY_INSERT プロパティを ON に設定する
SET IDENTITY_INSERT Person.Address ON;

-- IDENTITY カラムに明示的な値を挿入する
INSERT INTO Person.Address (AddressID, FirstName, LastName)
VALUES (1000, 'John', 'Doe');

-- IDENTITY_INSERT プロパティを OFF に設定する
SET IDENTITY_INSERT Person.Address OFF;

-- IDENTITY カラムに明示的な値を挿入しようとすると、エラーが発生する
INSERT INTO Person.Address (AddressID, FirstName, LastName)
VALUES (1001, 'Jane', 'Doe');

GO

-- エラーメッセージ:
-- Cannot insert explicit value for identity column in table 'Person.Address' when IDENTITY_INSERT is set to OFF.

このコードを実行すると、最初の INSERT ステートメントは成功しますが、2 番目の INSERT ステートメントはエラーになります。

以下のコードは、IDENTITY カラムに明示的な値を挿入しない方法を示しています。

USE AdventureWorks2019;

INSERT INTO Person.Address (FirstName, LastName)
VALUES ('John', 'Doe');

GO

-- AddressID カラムには、自動的に一意の値が生成されます
SELECT AddressID, FirstName, LastName
FROM Person.Address
WHERE FirstName = 'John'
AND LastName = 'Doe';

GO

このコードを実行すると、AddressID カラムには自動的に 1001 という値が生成されます。

補足

  • このコードは、SQL Server 2019 で実行されています。
  • コードを実行する前に、AdventureWorks2019 データベースを復元する必要があります。



IDENTITY カラムに明示的な値を挿入するその他の方法

INSERT EXEC ステートメントを使用する

USE AdventureWorks2019;

DECLARE @sql NVARCHAR(MAX);

SET @sql = N'INSERT INTO Person.Address (AddressID, FirstName, LastName)
VALUES (1000, ''John'', ''Doe'')';

EXEC sp_executesql @sql;

GO

このコードは、sp_executesql ストアドプロシージャを使用して、動的に INSERT ステートメントを実行します。

OUTPUT 句を使用する

USE AdventureWorks2019;

DECLARE @AddressID INT;

INSERT INTO Person.Address (FirstName, LastName)
OUTPUT INSERTED.AddressID
VALUES ('John', 'Doe');

SELECT @AddressID;

GO

このコードは、OUTPUT 句を使用して、INSERT ステートメントによって挿入された値を取得します。

MERGE ステートメントを使用する

USE AdventureWorks2019;

MERGE Person.Address AS T
USING (VALUES (1000, 'John', 'Doe')) AS S (AddressID, FirstName, LastName)
ON T.AddressID = S.AddressID
WHEN MATCHED THEN
UPDATE SET T.FirstName = S.FirstName, T.LastName = S.LastName
WHEN NOT MATCHED THEN
INSERT (AddressID, FirstName, LastName)
VALUES (S.AddressID, S.FirstName, S.LastName);

GO

このコードは、MERGE ステートメントを使用して、既存のレコードを更新するか、新しいレコードを挿入します。

補足

  • これらの方法は、IDENTITY_INSERT プロパティを使用するよりも複雑です。
  • これらの方法は、特定の状況でのみ使用されます。

X 0 注意事項 X


sql sql-server sybase


IN演算子・EXISTSサブクエリ・UNION・JOINを使って検索条件を指定する方法

SQLで、2つのLIKEステートメントをOR条件で結合して、複数の条件に合致するレコードを抽出したい場合があります。解決方法2つのLIKEステートメントをOR条件で結合するには、以下の方法があります。WHERE句でOR演算子を使用するこの例では、列名が検索文字1または検索文字2を含むレコードが抽出されます。...


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

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


SQL ServerでSELECT * INTO tempTable FROM CTEQueryの完全ガイド

この解説では、SQL Serverで共通テーブル式(CTE)クエリから一時テーブルを作成する方法を紹介します。一時テーブルは、データベースセッション中にのみ存在する仮想的なテーブルです。 データ分析や中間処理など、一時的なデータ保存に役立ちます。...


システムテーブルpg_catalog.pg_attributeで属性情報を取得

\d コマンドを使用するpsqlコマンドラインツールで \d コマンドを使用すると、テーブルの構造情報を含む一覧が表示されます。例:出力例:information_schema スキーマには、データベースに関するメタデータを含むビューが用意されています。...


PostgreSQLで空またはNULL値を確実にチェックして、データの信頼性を向上させる!

IS NULL演算子最も簡単な方法は、IS NULL演算子を使用することです。このクエリは、列名がNULL値であるすべてのレコードを返します。COALESCE関数は、NULL値を指定されたデフォルト値に置き換えるために使用できます。このクエリは、列名がNULL値の場合はデフォルト値を、そうでなければ列名の値を返します。...


SQL SQL SQL SQL Amazon で見る



INSERT EXECステートメントを使用したIDENTITYカラムへの値挿入

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


【保存版】SQL ServerでIDENTITY_INSERTを使いこなす!有効化・無効化の方法とサンプルコード

IDENTITY_INSERT を有効化すると、以下の操作が可能になります。テーブルに重複する ID 値を持つ行を挿入する特定のシーケンスに従って ID 値を割り当てるIDENTITY_INSERT の有効化と無効化は、次の SET ステートメントを使用して行うことができます。