web-dev-qa-db-ja.com

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

次のスクリプトを実行すると、以下のエラーが発生します。エラーとは何ですか?また、それをどのように解決することができますか?

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

エラー:

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

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

283
Jaison

identity列であるOperationIdに値を挿入しています。

あなたはあなた自身のアイデンティティ値を指定することができるようにテーブルの上のアイデンティティ挿入をオンにすることができます。

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 
396
pjp

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

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

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

なぜあなたはアイデンティティフィールドに値を入れようとしているのですか?

38
HLGEM

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

SET IDENTITY_INSERT tableName ON

例:テーブル名がstudentの場合、クエリは次のようになりますSET IDENTITY_INSERT student ON

Webアプリケーションでこのエラーが発生した場合、またはエンティティフレームワークを使用している場合は、まずSQLサーバーでこのクエリを実行し、 エンティティモデル(.edmx fileを更新して project を構築します。解決される

21
Umang Patwa

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

例:

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

エラーを発生させずにレコードを挿入する方法は、基本的に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]のOUTPUT。[Persons]は:になります

ID    LastName   FirstName
1     DOE        Jane
2     BROWN      JOE

2)2番目の例では、IDENTITY_INSERTがONのときにエラーを発生させることなく新しいレコードをテーブルに挿入できます。 PRIMARY KEY "ID"が存在しなければならない "INSERT INTO"文から この場合、IDがINSERTから存在しない限り 「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]のOUTPUT。[Persons]は:になります

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

たとえば、テーブル名が School の場合は、単にこのステートメントを使用できます。挿入の前にidentity_insertが _ on _ に設定されていることを確認し、insert queryの後にidentity_insert _ off _ をオンにします。

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

SQL Serverの更新にliquibaseを使用している場合は、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
iowatiger08

それは自動インクリメントされているのでそこにあってはならないあなたのクエリに前述のOperationIdがあります

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

だからあなたのクエリはなります

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

主キーがクラスと同じ名前であることを確認します。唯一の違いは、主キーに「ID」が追加されていること、または主キーに[Key]を指定しないことです。クラス名.

最善の解決策は、注釈GeneratedValue(strategy = ...)を使用することです。

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

この列はIDENTITY戦略を使用してデータベースによって生成されるため、注意する必要はありません-データベースが実行します。

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

また、接続にOracle SQL Developerを使用している場合は、/ sqldev:stmt /を追加することを忘れないでください。

/ sqldev:stmt / identity_insertテーブルをオンに設定する。

0
Hao Deng

「テーブルの挿入」の用途が何であるかわかりませんが、単に値を挿入しようとしているのであれば、次のようにしてください。

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

同じエラーメッセージが表示されましたが、これでうまくいくはずです。主キーである限り、IDは自動的に自動増分されます。

0
Matthew