Insert table(OperationID,OpDescription,FilterID)
values (20,'Hierachy Update',1)
错误:
服务器: Msg 544, 级别 16, 状态 1, 第 1 行
当 IDENTITY_INSERT 设置为 OFF 时,无法向表 'table' 中的标识列插入显式值。
Insert table(OperationID,OpDescription,FilterID)
values (20,'Hierachy Update',1)
错误:
服务器: Msg 544, 级别 16, 状态 1, 第 1 行
当 IDENTITY_INSERT 设置为 OFF 时,无法向表 'table' 中的标识列插入显式值。
您正在插入一个自增列(identity column),对于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
如果您在 SQL 服务器上遇到此错误,则运行以下查询:
SET IDENTITY_INSERT tableName ON
这仅适用于数据库中的单个表
例如,如果表名为 student
,则查询如下:
SET IDENTITY_INSERT student ON
如果您在您的 Web 应用程序或者您使用了实体框架时遇到此错误,请首先在 SQL 服务器上运行此查询并更新您的实体模型(.edmx 文件),然后构建您的项目,此错误将被解决。不要给 OperationID 赋值,因为它将自动生成。尝试这样做:
Insert table(OpDescription,FilterID) values ('Hierachy Update',1)
在将IDENTITY_INSERT设置为ON时要非常谨慎。除非数据库处于维护模式并设置为单用户,否则这是一种不良实践。这不仅会影响您的插入操作,还会影响任何试图访问表格的其他人的插入操作。
为什么要尝试将值放入标识字段中呢?
DatabaseGenerated
属性:
示例:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int TaskId { get; set; }
DatabaseGeneratedOption.Identity
指定了,但我仍然收到错误信息。这是我的错,我在新行中放置了伪ID以区分它们在网页上的不同,我希望在insert
之前将它们简单地设置为null就足够了。 - Auspex插入记录有两种基本方法,可以避免出现错误:
1)当IDENTITY_INSERT被设置为OFF时。主键"ID"必须不存在
2)当IDENTITY_INSERT被设置为ON时。主键"ID"必须存在
根据下面的示例,使用具有IDENTITY主键的同一表:
CREATE TABLE [dbo].[Persons] (
ID INT IDENTITY(1,1) PRIMARY KEY,
LastName VARCHAR(40) NOT NULL,
FirstName VARCHAR(40)
);
1) 在第一个示例中,当IDENTITY_INSERT关闭时,您可以向表中插入新记录而不会出现错误。在"INSERT INTO"语句中不得提供 PRIMARY KEY 的 "ID",系统将自动添加唯一ID值:如果在此情况下在INSERT中提供了ID,将出现错误"Cannot insert explicit value for identify column in table..."。
SET IDENTITY_INSERT [dbo].[Persons] OFF;
INSERT INTO [dbo].[Persons] (FirstName,LastName)
VALUES ('JANE','DOE');
INSERT INTO Persons (FirstName,LastName)
VALUES ('JOE','BROWN');
表 [dbo].[Persons] 的输出结果如下:
ID LastName FirstName
1 DOE Jane
2 BROWN JOE
2) 在第二个示例中,当IDENTITY_INSERT为ON时,您可以向表中插入新记录而不会出现错误。 主键“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');
表[dbo].[Persons]的输出结果如下:
ID LastName FirstName
1 DOE Jane
2 BROWN JOE
3 BLACK JACK
5 WHITE JOHN
如果您的表名为School,您可以简单地使用此语句。在插入之前,请确保将identity_insert设置为ON,并在插入查询后将identity_insert关闭OFF
SET IDENTITY_INSERT School ON
/*
insert query
enter code here
*/
SET IDENTITY_INSERT School OFF
;
,则 SET IDENTITY_INSERT mytable ON
命令不会对后面的行起作用。SET IDENTITY_INSERT mytable ON;
INSERT INTO mytable (VoucherID, name) VALUES (1, 'Cole');
出现错误:
当IDENTITY_INSERT设置为OFF时,在表'mytable'中无法插入显式值。
但是像这样的查询将会成功:
SET IDENTITY_INSERT mytable ON
INSERT INTO mytable (VoucherID, name) VALUES (1, 'Cole')
SET IDENTITY_INSERT mytable OFF;
似乎 SET IDENTITY_INSERT
命令只在事务中生效,而 ;
则表示事务的结束。大家都谈论SQL,但EntityFramework怎么了?我读完整篇文章后发现没有人解决EF的问题。所以几天后,我终于找到了解决方案:
在创建模型时,EF Core上下文中有一条指令:modelBuilder.Entity<Cliente>(entity => { entity.Property(e => e.Id).ValueGeneratedNever();
这也会产生错误,解决方法:将其更改为ValueGeneratedOnAdd(),然后它就可以运行了!
如果您正在使用liquibase更新SQL Server,您可能正在尝试将记录键插入到自动递增字段中。通过从插入中删除该列,您的脚本应该可以运行。
<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>