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

2024-04-02

SQL Server で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.

概要:

このエラーメッセージは、IDENTITYプロパティを持つカラムに明示的な値を挿入しようとしたときに発生します。IDENTITYカラムは、通常、自動的に値が生成されますが、特定の状況では、明示的な値を指定することもできます。

原因:

このエラーメッセージの主な原因は、以下のいずれかです。

  • IDENTITYカラムに明示的な値を挿入しようとしているが、IDENTITY_INSERT設定が無効になっている。
  • IDENTITYカラムを含む列リストを指定していない。

解決方法:

このエラーメッセージを解決するには、以下のいずれかの方法を実行する必要があります。

IDENTITY_INSERT設定を有効にする:

SET IDENTITY_INSERT テーブル名 ON;

-- データ挿入

SET IDENTITY_INSERT テーブル名 OFF;
INSERT INTO テーブル名 (ID, カラム名1, カラム名2)
VALUES (1, 値1, 値2);

補足:

  • IDENTITYカラムに明示的な値を挿入する必要があるのは、稀なケースです。通常は、自動的に値を生成させる方が効率的です。
  • IDENTITY_INSERT設定を有効にする場合は、データ挿入後に必ず無効にすることを忘れないでください。



USE AdventureWorks2019;

-- IDENTITY_INSERT設定を有効にする
SET IDENTITY_INSERT Person.Address ON;

-- データ挿入
INSERT INTO Person.Address (AddressID, AddressLine1, City, StateProvinceID, PostalCode)
VALUES (1000, '123 Main Street', 'Anytown', 50, '12345');

-- IDENTITY_INSERT設定を無効にする
SET IDENTITY_INSERT Person.Address OFF;

-- 確認
SELECT * FROM Person.Address WHERE AddressID = 1000;

IDENTITYカラムを含む列リストを指定して、IDENTITYカラムに明示的な値を挿入する例:

USE AdventureWorks2019;

INSERT INTO Person.Address (ID, AddressLine1, City, StateProvinceID, PostalCode)
VALUES (1001, '456 Elm Street', 'Anytown', 50, '12345');

-- 確認
SELECT * FROM Person.Address WHERE ID = 1001;

上記サンプルコードは、AdventureWorks2019データベースを使用しています。




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

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

USE AdventureWorks2019;

DECLARE @ID INT;

SET @ID = 1002;

EXEC (@ID, '789 Oak Street', 'Anytown', 50, '12345');

-- 確認
SELECT * FROM Person.Address WHERE ID = 1002;
USE AdventureWorks2019;

MERGE Person.Address AS T
USING (VALUES (1003, '1011 Main Street', 'Anytown', 50, '12345')) AS S
ON T.AddressID = S.AddressID
WHEN MATCHED THEN
UPDATE SET
T.AddressLine1 = S.AddressLine1,
T.City = S.City,
T.StateProvinceID = S.StateProvinceID,
T.PostalCode = S.PostalCode
WHEN NOT MATCHED THEN
INSERT (AddressID, AddressLine1, City, StateProvinceID, PostalCode)
VALUES (S.AddressID, S.AddressLine1, S.City, S.StateProvinceID, S.PostalCode);

-- 確認
SELECT * FROM Person.Address WHERE ID = 1003;

SSMS (SQL Server Management Studio) を使用する:

SSMS を使用して、IDENTITYカラムに明示的な値を挿入することもできます。

  1. オブジェクト エクスプローラーテーブル フォルダーを展開し、Person.Address テーブルを選択します。
  2. テーブル デザイナー を開きます。
  3. AddressID カラムの プロパティ ウィンドウを開きます。
  4. IDENTITY プロパティを No に設定します。
  5. OK をクリックして、変更を保存します。
  6. データ エディターPerson.Address テーブルを開きます。
  7. 新しい行を追加し、AddressID カラムに明示的な値を入力します。

注意事項:

  • INSERT EXEC ステートメントは、複雑な条件を設定する場合に便利です。
  • MERGE ステートメントは、既存のデータと新しいデータをマージする場合に便利です。
  • SSMS を使用する方法

sql-server


SQL Server で未使用だが割り当てられたテーブル領域

SQL Server では、テーブルを作成または拡張すると、テーブルデータ用にディスク領域が割り当てられます。しかし、データが削除されたり、テーブルが切り詰められたりしても、割り当てられた領域は解放されない場合があります。この結果、未使用だが割り当てられたテーブル領域が発生します。...


SQL Server初心者でも安心!大容量 .sqlファイルのインポート手順

方法 1:SQL Server Management Studio (SSMS) を使用するSSMS は、Microsoft が提供する無料のツールです。SSMS を使用して . sql ファイルをインポートするには、次の手順に従います。SSMS を起動し、SQL Server インスタンスに接続します。...


インデックスの存在確認:システムカタログビュー vs INFORMATION_SCHEMA

システムカタログビューを使用するSQL Serverは、データベースやデータベースサーバーに関する情報を提供するシステムカタログビューを提供しています。これらのビューを組み合わせることで、インデックスの名前とそれに関連するカラム名の一覧を取得できます。...


DELETE文 vs TRUNCATE TABLE:SQL Serverデータベースの全データを高速削除する方法

SQL Serverデータベースの全データを削除するには、主に以下の2つの方法があります。DELETE文を使用するTRUNCATE TABLE命令を使用するDELETE文は、条件を指定してデータを削除するSQL文です。全データを削除するには、条件を指定せずに実行します。...


SQL Server 復元エラー: アクセスが拒否された時のトラブルシューティングガイド

SQL Server データベースの復元時に、"アクセスが拒否されました"というエラーが発生する場合があります。このエラーは、さまざまな原因によって発生します。この解説では、エラーの原因を特定し、解決するための詳細な手順を説明します。原因:...