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

322 sql sql-server sybase

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

Insert table(OperationID,OpDescription,FilterID)
values (20,'Hierachy Update',1)
Run Code Online (Sandbox Code Playgroud)

错误:

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

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

pjp*_*pjp 433

您要插入的值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 
Run Code Online (Sandbox Code Playgroud)

  • 精确+1 - 转动选项以允许显式插入**ON**,然后插入,然后再次选择**OFF** (13认同)
  • 如果你真的想将你的值添加到标识列,这是你的答案,但另一方面,有人已经将列设置为在插入时自行递增.在这种情况下,表将跟踪下一个空闲号码,您不需要自己生成OperationID.SELECT SCOPE_IDENTITY()可以获取新的id. (13认同)
  • 危险的做法,不建议使用它,没有告诫说明为什么这是一个糟糕的主意.答案很差. (13认同)
  • 很好的答案,但要确保你知道你在做什么.对我来说,使用数据为数据库设定种子是很有用的,其中外键需要在不同的表上匹配 (7认同)
  • @UlyssesAlves:这个选项只能在数据库范围内为一个表打开 - 所以如果你把它留给一个表,你将无法将它用于另一个表.另外:它不是一个应该保留的选项 - 默认情况下,你应该让SQL Server处理身份值 - 这只是****用作非常特殊情况的最后手段 - 不是通用选项离开在闲暇时开启或关闭...... (2认同)

Wae*_*oul 54

不要将值赋予OperationID,因为它将自动生成.试试这个:

Insert table(OpDescription,FilterID) values ('Hierachy Update',1)
Run Code Online (Sandbox Code Playgroud)

  • 如果您想要自动生成的OperationID,这是正确的答案 (5认同)

HLG*_*GEM 40

要非常小心将IDENTITY_INSERT设置为ON.除非数据库处于维护模式并设置为单个用户,否则这种做法很糟糕.这不仅会影响您的插入,也会影响其他任何试图访问该表的插入.

为什么要尝试将值放入身份字段?

  • 影响以什么方式?这是会话级选项,而不是表的属性. (4认同)
  • 您想要维护关系的两个数据库之间的一次数据同步.例如,我用它将我的产品架构从一个数据库拉到另一个数据库 (4认同)
  • 问题是"你能指出它是什么以及如何解决它?" 你的答案是一个评论,它提出了一个警告和另一个问题,而不是一个解决问题的正确答案. (2认同)

Uma*_*twa 33

简单如果您在SQL服务器上收到此错误,则运行此查询 -

SET IDENTITY_INSERT tableName ON
Run Code Online (Sandbox Code Playgroud)

例如,如果表名是学生,则查询看起来像这样 SET IDENTITY_INSERT student ON

如果您在Web应用程序上遇到此错误或使用实体框架,则首先在SQL Server上运行此查询并更新您的实体模型(.edmx file) 并构建您的项目,此错误将得到解决


use*_*490 19

在该表的实体中,添加DatabaseGenerated设置了标识插入的列上方的属性:

例:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int TaskId { get; set; }
Run Code Online (Sandbox Code Playgroud)


QA *_*ist 19

在没有错误的情况下,INSERT记录基本上有两种不同的方法:

1)当IDENTITY_INSERT设置为OFF时.主要钥匙"身份证"不得存在

2)当IDENTITY_INSERT设置为ON时.必须存在 PRIMARY KEY "ID"

根据使用IDENTITY PRIMARY KEY创建的同一个表中的以下示例:

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

1)在第一个示例中,您可以在IDENTITY_INSERT为OFF时将新记录插入表中而不会出现错误."INSERT INTO"语句中不得出现 PRIMARY KEY "ID",并自动添加唯一的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');
Run Code Online (Sandbox Code Playgroud)

表[dbo]的输出.[人员]将是:

ID    LastName   FirstName
1     DOE        Jane
2     BROWN      JOE
Run Code Online (Sandbox Code Playgroud)

2)在第二个示例中,您可以在IDENTITY_INSERT为ON时将新记录插入表中而不会出现错误.只要ID值不存在,PRIMARY KEY "ID"必须出现在"INSERT INTO"语句:如果在这种情况下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'); 
Run Code Online (Sandbox Code Playgroud)

表[dbo]的输出.[人员]将是:

ID    LastName   FirstName
1     DOE        Jane
2     BROWN      JOE
3     BLACK      JACK
5     WHITE      JOHN
Run Code Online (Sandbox Code Playgroud)

  • 加上一个用于实际解释标志如何工作的。拯救了我的一天超人 (2认同)

小智 12

例如,如果您的表名是School,则可以使用此语句.在插入之前,请确保将identity_insert设置为ON,并在插入查询后将 identity_insert设置为 OFF

SET IDENTITY_INSERT School ON
/*
  insert query
  enter code here
*/
SET IDENTITY_INSERT School OFF
Run Code Online (Sandbox Code Playgroud)


cry*_*bhu 10

请注意,如果您使用 关闭每一行;,则该SET IDENTITY_INSERT mytable ON命令将不适用于以下行。


像这样的查询

SET IDENTITY_INSERT mytable ON;
INSERT INTO mytable (VoucherID, name) VALUES (1, 'Cole');
Run Code Online (Sandbox Code Playgroud)

给出错误
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;
Run Code Online (Sandbox Code Playgroud)

似乎该SET IDENTITY_INSERT命令仅适用于交易,而;will 表示交易结束。


iow*_*r08 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>
Run Code Online (Sandbox Code Playgroud)


小智 5

另一种情况是检查主键是否与您的类同名,唯一的区别是您的主键附加了一个“ID”,或者在主键上指定 [Key],这与主键的方式无关。类被命名。


小智 5

您的查询中有预先提到的 OperationId 不应该存在,因为它是自动增加的

Insert table(OperationID,OpDescription,FilterID)
values (20,'Hierachy Update',1)
Run Code Online (Sandbox Code Playgroud)

所以你的查询将是

Insert table(OpDescription,FilterID)
values ('Hierachy Update',1)
Run Code Online (Sandbox Code Playgroud)


Tom*_*ski 5

最好的解决方案是使用注释GeneratedValue(strategy = ...),即

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column ...
private int OperationID;
Run Code Online (Sandbox Code Playgroud)

它说,该列是由数据库使用 IDENTITY 策略生成的,您不需要照顾 - 数据库会做它。


小智 5

每个人都在评论 SQL,但是 EntityFramework 中发生了什么?我花了整篇文章阅读,但没有人解决 EF。所以几天后找到了解决方案:EF Core 在创建模型的上下文中有这样的指令: modelBuilder.Entity<Cliente>(entity => { entity.Property(e => e.Id).ValueGeneratedNever();

这也会产生错误,解决方案:您必须通过 ValueGeneratedOnAdd() 及其作品进行更改!