次のスクリプトを実行すると、以下のエラーが発生します。エラーとは何ですか?また、それをどのように解決することができますか?
Insert table(OperationID,OpDescription,FilterID)
values (20,'Hierachy Update',1)
エラー:
サーバー:メッセージ544、レベル16、状態1、行1
IDENTITY_INSERTがOFFに設定されている場合、テーブル 'table'のID列に明示的な値を挿入できません.
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
operationIDは自動的に生成されるため、OperationIDに値を入れないでください。これを試して:
Insert table(OpDescription,FilterID) values ('Hierachy Update',1)
IDENTITY_INSERTをONに設定することには十分注意してください。データベースがメンテナンスモードでシングルユーザーに設定されていない限り、これは不適切な方法です。これはあなたの挿入だけでなく、テーブルにアクセスしようとしている他の誰かの挿入にも影響します。
なぜあなたはアイデンティティフィールドに値を入れようとしているのですか?
単にSQLサーバーでこのエラーが発生した場合は、このクエリを実行してください。
SET IDENTITY_INSERT tableName ON
例:テーブル名がstudentの場合、クエリは次のようになりますSET IDENTITY_INSERT student ON
Webアプリケーションでこのエラーが発生した場合、またはエンティティフレームワークを使用している場合は、まずSQLサーバーでこのクエリを実行し、 エンティティモデル(
.edmx file
) を更新して project を構築します。解決される
そのテーブルのエンティティで、ID挿入が設定されている列の上にDatabaseGenerated
属性を追加します。
例:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int TaskId { get; set; }
エラーを発生させずにレコードを挿入する方法は、基本的に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
たとえば、テーブル名が School の場合は、単にこのステートメントを使用できます。挿入の前にidentity_insertが _ on _ に設定されていることを確認し、insert queryの後にidentity_insert _ off _ をオンにします。
SET IDENTITY_INSERT School ON
/*
insert query
enter code here
*/
SET IDENTITY_INSERT School OFF
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>
それは自動インクリメントされているのでそこにあってはならないあなたのクエリに前述のOperationIdがあります
Insert table(OperationID,OpDescription,FilterID)
values (20,'Hierachy Update',1)
だからあなたのクエリはなります
Insert table(OpDescription,FilterID)
values ('Hierachy Update',1)
主キーがクラスと同じ名前であることを確認します。唯一の違いは、主キーに「ID」が追加されていること、または主キーに[Key]を指定しないことです。クラス名.
最善の解決策は、注釈GeneratedValue(strategy = ...)
を使用することです。
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column ...
private int OperationID;
この列はIDENTITY戦略を使用してデータベースによって生成されるため、注意する必要はありません-データベースが実行します。
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
を追加して、そのセットをデータ型 int に設定することで修正できます。列が主キーであり、SQLでIsIDentityがtrueに設定されている場合、このコード行は必要ありません[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
また、接続にOracle SQL Developerを使用している場合は、/ sqldev:stmt /を追加することを忘れないでください。
/ sqldev:stmt / identity_insertテーブルをオンに設定する。
「テーブルの挿入」の用途が何であるかわかりませんが、単に値を挿入しようとしているのであれば、次のようにしてください。
Insert Into [tablename] (OpDescription,FilterID)
values ('Hierachy Update',1);
同じエラーメッセージが表示されましたが、これでうまくいくはずです。主キーである限り、IDは自動的に自動増分されます。