当IDENTITY_INSERT设置为OFF时,无法在表'table'中为identity列插入显式值

时间:2009-08-26 11:19:58

标签: sql sql-server sybase

执行以下脚本时出现以下错误。有什么错误,以及如何解决?

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

错误:

  

服务器:消息544,级别16,状态1,行1

     

当IDENTITY_INSERT设置为OFF时,无法在表'table'中为identity列插入显式值。

22 个答案:

答案 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)

  1. 当您有一个(主键)列在SQL中没有设置为Is Identity为true并且您在插入过程中未传递其显式值时,会发生这种情况。它将占据第一行,然后您将无法插入第二行,错误将弹出。可以通过在PrimaryKey列中添加此行代码[DatabaseGenerated(DatabaseGeneratedOption.Identity)]并确保将其设置为数据类型 int 来更正此错误。如果该列是主键,并且在SQL中将IsIDentity设置为true,则不需要此行代码[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  2. 当您有一个不是主键的列,在SQL中将“身份标识”设置为true,并且在您的EF中没有添加此行代码[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  3. 时,也会发生这种情况

答案 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