SQL ServerのID列に値を挿入しようとしたことがある場合は、次のようなエラーが発生した可能性があります。
IDENTITY_INSERTがOFFに設定されている場合、テーブル「Artists」のID列に明示的な値を挿入できません。
これは正常です。 ID列があるのには理由があります。挿入された各行の増分値が列に自動的に入力されます。したがって、その列に値を挿入する必要はありません。
ただし、することもあります ID列に値を挿入する必要があります。たとえば、独自のID値を保持する必要のあるデータをデータベースに入力することができます。この場合、IDENTITY
を上書きする必要があります 財産。方法は次のとおりです。
IDENTITY_INSERTを有効にする
IDENTITY
を上書きできます IDENTITY_INSERT
を有効にしてプロパティ 。これにより、独自の値をID列に挿入できます。
次に例を示します:
SET IDENTITY_INSERT Artists ON; INSERT INTO Artists (ArtistId, ArtistName, ActiveFrom) VALUES (1001, 'AC/DC','1973-01-11'), (1002, 'Allan Holdsworth','1969-01-01'), (1003, 'Buddy Rich','1919-01-01'); SET IDENTITY_INSERT Artists OFF;
この例では、ArtistsテーブルにID列があります(この場合、ArtistIdはID列です)。 IDENTITY
を上書きするには INSERT
の前にあるプロパティ SET IDENTITY_INSERT Artists ON
を含むステートメント 。このT-SQLステートメントを使用すると、「このテーブルにID列があることはわかっていますが、この場合は myを挿入します。 代わりに値」。
IDENTITY_INSERT
に注意してください 一度に有効にできるのは1つのテーブルのみです。したがって、IDENTITY_INSERT
を無効にすることをお勧めします 挿入直後。これにより、元の状態に戻り、必要に応じて別のテーブルのID列を上書きできます。
また、IDENTITY_INSERT
を有効にするため ユーザーはテーブルを所有しているか、ALTER
を持っている必要があります テーブルの許可。
テーブル間のコピー
IDENTITY_INSERT
を有効にする テーブル間でデータをコピーする場合にも役立ちます。たとえば、あるテーブルから別のテーブルにデータを入力することができます。
ArtistsテーブルからArtists_Archiveテーブルにデータをコピーする例を次に示します。
SET IDENTITY_INSERT Artists_Archive ON; INSERT INTO Artists_Archive (ArtistId, ArtistName, ActiveFrom) SELECT ArtistId, ArtistName, ActiveFrom FROM Artists; SET IDENTITY_INSERT Artists_Archive OFF;
注意すべき点の1つは、ID列に主キー制約がある場合、宛先テーブルにすでに存在するすべての値を拒否することです。したがって、ID列をオーバーライドすることが間違いなくやりたいことであることを絶対に確認する必要があります。