IDENTITY_INSERTがOFFに設定されている場合、テーブル 'table'のID列に明示的な値を挿入できません


361

次のスクリプトを実行すると、次のエラーが発生します。どのようなエラーがあり、どのように解決できますか?

Insert table(OperationID,OpDescription,FilterID)
values (20,'Hierachy Update',1)

エラー:

サーバー:メッセージ544、レベル16、状態1、行1

IDENTITY_INSERTがOFFに設定されている場合、テーブル 'table'のID列に明示的な値を挿入できません。



2
@HimanshuAhujaこの質問(1334012)は10歳で、リンクしたのは1つだけです。どちらかと言えば、新しい質問が重複しています。しかし、よく見てみると、それらが異なることがわかります(新しいものはIDENTITY_INSERTをONとして指定します)。フラグ/コメントを削除してください。
ジェシー

@jasieは、このフラグをいつ投稿したか覚えていないのでそれを行います
Himanshu Ahuja

回答:


467

OperationIdそのための値をID列に挿入しています。

このようにテーブルでID挿入をオンにすると、独自のID値を指定できます。

SET IDENTITY_INSERT Table1 ON

INSERT INTO Table1
/*Note the column list is REQUIRED here, not optional*/
            (OperationID,
             OpDescription,
             FilterID)
VALUES      (20,
             'Hierachy Update',
             1)

SET IDENTITY_INSERT Table1 OFF 

14
+1は正確に-明示的な挿入ができるようにするオプションをオンON、そして挿入し、オプションのターンOFFを再び
marc_s

13
ID列に値を追加したい場合は、これが答えですが、一方で、挿入時に列が単独で増加するように設定されています。その場合、テーブルは次の空き番号を追跡するため、自分でOperationIDを生成する必要はありません。新しいIDはSELECT SCOPE_IDENTITY()でフェッチできます。
Hakan Winther、

15
危険な練習です。なぜそれが悪いアイデアであるかを警告する警告なしにそれを使用することをお勧めしません。非常に悪い答え。
HLGEM 2011年

7
良い答えですが、自分が何をしているかを確実に知っておいてください。私にとって、外部キーが異なるテーブルで一致する必要があるデータをデータベースにシードすることは有用です
Berty

2
@UlyssesAlves:このオプションは、データベース全体で1つのテーブルに対してのみオンにすることができます。そのため、1つのテーブルに対してこのオプションをオンのままにしておくと、別のテーブルでこれを使用できなくなります。また、これはオンのままにする必要のあるオプションではありません-デフォルトでは、SQL ServerにID値を処理させる必要があります-これは、非常に特殊なケースの最後の手段としてのみ意図されています- オンまたはオフのままにする汎用オプションではありませんあなたのレジャー...
marc_s

61

自動的に生成されるため、OperationIDに値を設定しないでください。これを試して:

Insert table(OpDescription,FilterID) values ('Hierachy Update',1)

5
あなたが自動的に生成さOperationIDしたい場合は、これは正しい答えである
shaijutを

46

SQLサーバーでこのエラーが発生した場合は、次のクエリを実行してください。

SET IDENTITY_INSERT tableName ON

これはデータベースの単一のテーブルのみで機能します。 たとえば、テーブル名がStudentの場合、クエリは次のようになります。 SET IDENTITY_INSERT student ON

Webアプリケーションでこのエラーが発生した場合、またはエンティティフレームワークを使用している場合は、最初にSQLサーバーでこのクエリを実行してエンティティモデル.edmx fileを更新しプロジェクトをビルドすると、このエラーが解決されます


これは、EFを使用したMVC Webアプリの場合で、モデルを.edmxから削除して再度追加(データベースからモデルを右クリック)し、プロジェクトをクリーンアップして再ビルドするだけで機能しました。ありがとう@Umang Patwa
Ishwor Khanal

42

IDENTITY_INSERTをONに設定する場合は十分に注意してください。データベースがメンテナンスモードでシングルユーザーに設定されていない限り、これは不適切な方法です。これは、挿入だけでなく、テーブルにアクセスしようとしている他の人にも影響します。

なぜIDフィールドに値を入れようとしているのですか?


5
どのように影響しますか?これは、テーブルのプロパティではなく、セッションレベルのオプションです。
Martin Smith、

5
関係を維持したい2つのデータベース間で1回限りのデータ同期。たとえば、あるデータベースから別のデータベースに製品スキーマをプルするために使用しました
NSjonas 2013年

1
@NSjonas、それはset Identity _insert table1 ONの良い使い方です。これを使用して、アプリケーションから何かを実行し、単純な挿入でIDを生成できるようにしたいと思った人がいます。
HLGEM 2013年

2
問題は、「それが何であり、どのように解決できるかを指定できますか」です。あなたの答えは、問題に対処する適切な答えではなく、警告と別の質問を引き起こすコメントです。
品質の触媒

ええ、主キーに値を挿入しないでください。
ドフラミンゴ2017年

22

エラーなしでレコードを挿入するには、基本的に2つの方法があります。

1)IDENTITY_INSERTがOFFに設定されている場合。主キー「ID」は存在していてはいけません

2)IDENTITY_INSERTがONに設定されている場合。主キー「ID」は存在している必要があります

IDENTITY PRIMARY KEYで作成された同じテーブルからの次の例のように:

CREATE TABLE [dbo].[Persons] (    
    ID INT IDENTITY(1,1) PRIMARY KEY,
    LastName VARCHAR(40) NOT NULL,
    FirstName VARCHAR(40)
);

1)最初の例では、IDENTITY_INSERTがOFFの場合、エラーを発生させることなく新しいレコードをテーブルに挿入できます。主キー「ID」は「INSERT INTO」ステートメントから提示されてはならず、一意のID値が自動的に追加されます。この場合、INSERTからのIDが存在すると、「テーブルの列を識別するための明示的な値を挿入できません...」というエラーが発生します。

SET IDENTITY_INSERT [dbo].[Persons] OFF;
INSERT INTO [dbo].[Persons] (FirstName,LastName)
VALUES ('JANE','DOE'); 
INSERT INTO Persons (FirstName,LastName) 
VALUES ('JOE','BROWN');

TABLE [dbo]。[Persons]の出力は次のようになります。

ID    LastName   FirstName
1     DOE        Jane
2     BROWN      JOE

2)2番目の例では、IDENTITY_INSERTがONの場合、エラーを発生させることなく新しいレコードをテーブルに挿入できます。PRIMARY KEY "ID"は、ID値がまだ存在しない限り、 "INSERT INTO"ステートメントから存在する必要があります。この場合、IDがINSERTから存在しない場合、 "Explicit value must be ID列テーブルに指定されています...」

SET IDENTITY_INSERT [dbo].[Persons] ON;
INSERT INTO [dbo].[Persons] (ID,FirstName,LastName)
VALUES (5,'JOHN','WHITE'); 
INSERT INTO [dbo].[Persons] (ID,FirstName,LastName)
VALUES (3,'JACK','BLACK'); 

TABLE [dbo]。[Persons]の出力は次のようになります。

ID    LastName   FirstName
1     DOE        Jane
2     BROWN      JOE
3     BLACK      JACK
5     WHITE      JOHN

2
フラグがどのように機能するかを実際に説明するための1つ。スーパーマンを救った
John

20

そのテーブルのエンティティで、DatabaseGeneratedID挿入が設定されている列の上に属性を追加します。

例:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int TaskId { get; set; }

まあ、そうですが、私はEFの答えを本当に欲しがっていました:-)それでも、EFを使用したことがない、またはおそらく遭遇したことのないOPには適切ではありません。
Auspex 2018年

いずれにせよ、答えは間違っています。私のエンティティは既にで指定されていますがDatabaseGeneratedOption.Identity、それでもエラーが発生します。それは私自身のせいです。新しい行に疑似IDを入れて、Webページ上でそれらを区別しているので、insert十分なものになる前にそれらを単にnullにすることを望みます。
Auspex 2018年

13

たとえば、テーブル名がSchoolの場合、このステートメントを使用するだけで済みます。挿入する前に、identity_insertがONに設定されていることを確認し、 クエリの挿入後にidentity_insertを OFFにしてください

SET IDENTITY_INSERT School ON
/*
  insert query
  enter code here
*/
SET IDENTITY_INSERT School OFF

1
回答を少し拡張して、コマンドの説明、なぜ機能するのか、どのような効果があるのか​​を説明してください。
gareththegeek 2017年

@gareththegeekはい、ID列については、データを挿入するために必ずオンにする必要があります。

6

liquibaseを使用してSQL Serverを更新している場合は、autoIncrementフィールドにレコードキーを挿入しようとしている可能性があります。挿入から列を削除すると、スクリプトが実行されます。

<changeSet id="CREATE_GROUP_TABLE" >
    <createTable tableName="GROUP_D">
        <column name="GROUP_ID" type="INTEGER" autoIncrement="true">
            <constraints primaryKey="true"/>
        </column>
    </createTable>
</changeSet>

<changeSet id="INSERT_UNKNOWN_GROUP" >
    <insert tableName="GROUP_D">    

        <column name="GROUP_ID" valueNumeric="-1"/>
 ...
    </insert>
</changeSet>

4

クエリには前述のOperationIdがありますが、これは自動で出力されるため、そこに存在してはなりません。

Insert table(OperationID,OpDescription,FilterID)
values (20,'Hierachy Update',1)

だからあなたのクエリは

Insert table(OpDescription,FilterID)
values ('Hierachy Update',1)

3

もう1つの状況は、主キーがクラスと同じ名前であることを確認することです。唯一の違いは、主キーに「ID」が追加されていること、または主キーに[キー]を指定することです。クラスに名前が付けられます。


2
  1. これは、SQLでIs Identityがtrueに設定されていない(主キー)列があり、挿入時にその明示的な値を渡さない場合に発生します。最初の行が取得され、2番目の行を挿入できなくなり、エラーがポップアップします。これは[DatabaseGenerated(DatabaseGeneratedOption.Identity)]、PrimaryKey列に次のコード行を追加して修正し、データ型がintに設定されていることを確認してください。列が主キーであり、SQLでIsIDentityがtrueに設定されている場合、このコード行は必要ありません。[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  2. これは、主キーではない列があり、Is Identityがtrueに設定されているSQLで、EFにこのコード行を追加しなかった場合にも発生します [DatabaseGenerated(DatabaseGeneratedOption.Identity)]

おかげで、これはivが探し求めていた何時間もの修正でした。
Vishav Premlall

2

最善の解決策は、アノテーションを使用することでGeneratedValue(strategy = ...)、すなわち

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column ...
private int OperationID;

それは、この列はIDENTITY戦略を使用してデータベースによって生成され、あなたが面倒を見る必要がないことを示しています-データベースがそれを行います。


1

sequelize-typescript npmでsql-serverを使用しているときにこの問題が発生する場合は@AutoIncrement、ID列に必ず追加してください。

  @PrimaryKey
  @AutoIncrement
  @Column
  id!: number;

0

また、Oracle SQL Developerを使用して接続している場合は、必ず/ sqldev:stmt / を追加してください。

/ sqldev:stmt / identity_insert TABLEをオンに設定します。


明らかにこれは
当てはまり

0

「テーブルの挿入」の用途がわからないのですが、値を挿入するだけの場合は、次のことを試してください。

Insert Into [tablename] (OpDescription,FilterID)
values ('Hierachy Update',1);

同じエラーメッセージが表示されましたが、これでうまくいくと思います。IDは、主キーである限り、自動的にインクリメントされます。


0

データベースに何かを追加するたびに新しいオブジェクトを作成することで、この問題を解決しました。


0

で各行を閉じる場合;SET IDENTITY_INSERT mytable ONコマンドは次の行に対して保持されないことに注意してください。

つまり
、次のようなクエリ

SET IDENTITY_INSERT mytable ON;
INSERT INTO mytable (VoucherID, name) VALUES (1, 'Cole');

エラーを出します
Cannot insert explicit value for identity column in table 'mytable' when IDENTITY_INSERT is set to OFF.

ただし、次のようなクエリは機能します。

SET IDENTITY_INSERT mytable ON
INSERT INTO mytable (VoucherID, name) VALUES (1, 'Cole')
SET IDENTITY_INSERT mytable OFF;

SET IDENTITY_INSERTコマンドはトランザクションに対してのみ保持されるよう;で、トランザクションの終了を示します。


-1

インターフェイスを使用し、一般的な方法でsavechangesのメソッドを実装する場合、型指定されていないDBContextまたはDBSetを使用することで発生する問題

これがあなたのケースである場合、私は例えば強く型付けされたDBContexを提案します

MyDBContext.MyEntity.Add(mynewObject)

次に.Savechanges動作します


-1

.dbmlファイルにドラッグされたテーブルを削除して、再度それらを再度ドラッグするだけです。次に、ソリューションのクリーンアップ>ソリューションの再構築>ソリューションのビルド。

それは私のために働いたものです。

私は自分でテーブルを作成せず、VSとSSMSを使用していました。ASP.NETIdentityの次のリンクをたどりました:https ://docs.microsoft.com/en-us/aspnet/identity/overview/getting-started/ aspnet-identity-to-an-empty-or-existing-web-forms-projectの追加

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.