执行以下脚本时出现以下错误。有什么错误,以及如何解决?
Insert table(OperationID,OpDescription,FilterID)
values (20,'Hierachy Update',1)
错误:
服务器:消息544,级别16,状态1,行1
当IDENTITY_INSERT设置为OFF时,无法在表'table'中为identity列插入显式值。
答案 0 :(得分:397)
您正在为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
答案 1 :(得分:43)
不要将值赋予OperationID,因为它会自动生成。试试这个:
Insert table(OpDescription,FilterID) values ('Hierachy Update',1)
答案 2 :(得分:38)
要非常小心将IDENTITY_INSERT设置为ON。除非数据库处于维护模式并设置为单个用户,否则这种做法很糟糕。这不仅会影响您的插入,也会影响其他任何试图访问该表的插入。
为什么要尝试将值放入标识字段?
答案 3 :(得分:21)
简单如果您在SQL Server上收到此错误,请运行此查询 -
SET IDENTITY_INSERT tableName ON
例如,如果表名是学生,则查询如下所示 SET IDENTITY_INSERT student ON
如果您在Web应用程序上遇到此错误或使用实体框架,则首先在SQL Server上运行此查询并更新实体模型(
.edmx file
)并构建项目,此错误将得到解决
答案 4 :(得分:18)
在该表的实体中,在设置了标识插入的列上方添加DatabaseGenerated
属性:
示例:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int TaskId { get; set; }
答案 5 :(得分:13)
在没有错误的情况下,INSERT记录基本上有两种不同的方法:
1)当IDENTITY_INSERT设置为OFF时。 PRIMARY KEY “ID”不得出现
2)当IDENTITY_INSERT设置为ON时。必须存在PRIMARY KEY “ID”
根据使用IDENTITY PRIMARY KEY创建的同一个表中的以下示例:
node_modules/antd/dist/antd.less
1)在第一个示例中,当IDENTITY_INSERT为OFF时,您可以在表中插入新记录而不会出现错误。 “INSERT INTO”语句中的PRIMARY KEY “ID”不得存在,将自动添加唯一ID值。如果在这种情况下INSERT中存在ID,您将收到错误“无法为表中的标识列插入显式值...”
CREATE TABLE [dbo].[Persons] (
ID INT IDENTITY(1,1) PRIMARY KEY,
LastName VARCHAR(40) NOT NULL,
FirstName VARCHAR(40)
);
表[dbo]的输出。[人员]将是:
SET IDENTITY_INSERT [dbo].[Persons] OFF;
INSERT INTO [dbo].[Persons] (FirstName,LastName)
VALUES ('JANE','DOE');
INSERT INTO Persons (FirstName,LastName)
VALUES ('JOE','BROWN');
2)在第二个示例中,您可以在IDENTITY_INSERT为ON时将新记录插入表中而不会出现错误。只要ID值不存在,“INSERT INTO”语句中的主要“ID”必须存在 :如果INSERT中不存在该ID在这种情况下,您将收到错误“必须为标识列表指定显式值...”
ID LastName FirstName
1 DOE Jane
2 BROWN JOE
表[dbo]的输出。[人员]将是:
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');
答案 6 :(得分:8)
如果您的表名是学校,则可以使用此语句。 在插入之前,请确保identity_insert设置为 ON ,并在插入查询后转为identity_insert OFF
SET IDENTITY_INSERT School ON
/*
insert query
enter code here
*/
SET IDENTITY_INSERT School OFF
答案 7 :(得分:5)
请注意,如果要用;
关闭每一行,则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
命令仅适用于事务,而;
将表示事务结束。
答案 8 :(得分:4)
如果您使用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>
答案 9 :(得分:3)
您的查询中有前面提到的OperationId,它不应该存在,因为它是自动递增的
Insert table(OperationID,OpDescription,FilterID)
values (20,'Hierachy Update',1)
所以你的查询将是
Insert table(OpDescription,FilterID)
values ('Hierachy Update',1)
答案 10 :(得分:2)
好吧,我很轻松地解决了我的问题,请检查您的主键是否与您的类名相同,唯一的区别是您的主键附加了“ID”或指定了与主键不相关的[Key]如何命名这个班级。
答案 11 :(得分:2)
最好的解决方案是使用注释GeneratedValue(strategy = ...)
,即
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column ...
private int OperationID;
它说,此列是由数据库使用IDENTITY策略生成的,您无需担心-数据库会做到这一点。
答案 12 :(得分:2)
每个人都对SQL有所评论,但是EntityFramework中有什么巧合?我花了整整篇文章阅读,没有人解决过EF。因此,几天后找到了解决方案:
EF Core在创建模型的上下文中有一条类似的指令: modelBuilder.Entity<Cliente>(entity => { entity.Property(e => e.Id).ValueGeneratedNever();
这也会产生错误,解决方案:您必须通过ValueGeneratedOnAdd()及其工作方法进行更改!
答案 13 :(得分:1)
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
并确保将其设置为数据类型 int 来更正此错误。如果该列是主键,并且在SQL中将IsIDentity设置为true,则不需要此行代码[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
答案 14 :(得分:1)
如果在使用带有sequelize-typescript npm的sql-server时遇到此问题,请确保将@AutoIncrement
添加到ID列:
@PrimaryKey
@AutoIncrement
@Column
id!: number;
答案 15 :(得分:0)
我不确定“插入表”的用途是什么,但如果您只是想插入一些值,请尝试:
Insert Into [tablename] (OpDescription,FilterID)
values ('Hierachy Update',1);
我出现了相同的错误消息,但我认为这应该有效。只要它是主键,ID就会自动自动递增。
答案 16 :(得分:0)
如果您使用Oracle SQL Developer进行连接,请记得添加/ sqldev:stmt /
/ sqldev:stmt / set identity_insert TABLE on;
答案 17 :(得分:0)
在我的案例中,我插入的字符多于表中定义的字符。
在“我的表格”列中定义了nvarchar(3)
,而我传递的个字符超过了3个,并且同样出现了ERROR
消息。
它不能回答,但在某些情况下可能是相似的问题
答案 18 :(得分:0)
在我的情况下,我已将另一个属性设置为我的ModelBuilder的上下文中的键。
modelBuilder.Entity<MyTable>().HasKey(t => t.OtherProp);
我必须设置正确的ID
modelBuilder.Entity<MyTable>().HasKey(t => t.Id);
答案 19 :(得分:0)
我使用的是 asp.net core 5.0,我得到了那个错误。我收到该错误是因为我添加了另一个数据并触发了另一个 .SaveChanges()
方法,如下所示:
_unitOfWorkVval.RepositoryVariantValue.Create(variantValue);
int request = HttpContext.Response.StatusCode;
if (request == 200)
{
int tryCatch = _unitOfWorkCVar.Complete();
if (tryCatch != 0)
{
productVariant.CategoryVariantID = variantValue.CategoryVariantID;
productVariant.ProductID = variantValue.ProductID;
productVariant.CreatedDate = DateTime.Now;
_unitOfWorkProductVariant.RepositoryProductVariant.Create(productVariant);
_unitOfWorkVval.RepositoryVariantValue.Create(variantValue);
int request2 = HttpContext.Response.StatusCode;
if(request==200)
{
int tryCatch2=_unitOfWorkProductVariant.Complete();//The point where i get that error
}///.......
答案 20 :(得分:-1)
如果使用接口并以通用方式实现savechanges的实现方法,则使用非类型化DBContext或DBSet会引发问题
如果是这种情况,我建议强烈输入DBContex例如
MyDBContext.MyEntity.Add(mynewObject)
然后.Savechanges
将起作用
答案 21 :(得分:-1)
只需删除拖动到.dbml文件中的表,然后再次重新拖动它们即可。然后清除解决方案>重建解决方案>构建解决方案。
那对我有用。
我不是自己创建表格的,我使用的是VS和SSMS,我点击了此链接以获取ASP.NET身份:https://docs.microsoft.com/en-us/aspnet/identity/overview/getting-started/adding-aspnet-identity-to-an-empty-or-existing-web-forms-project