执行以下脚本时出现以下错误。错误是什么,如何解决?
Insert table(OperationID,OpDescription,FilterID)
values (20,'Hierachy Update',1)
错误:
服务器:消息544,级别16,状态1,第1行
当IDENTITY_INSERT设置为OFF时,无法在表'table'中为标识列插入显式值。
执行以下脚本时出现以下错误。错误是什么,如何解决?
Insert table(OperationID,OpDescription,FilterID)
values (20,'Hierachy Update',1)
错误:
服务器:消息544,级别16,状态1,第1行
当IDENTITY_INSERT设置为OFF时,无法在表'table'中为标识列插入显式值。
Answers:
您正在为此插入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,因为它将自动生成。尝试这个:
Insert table(OpDescription,FilterID) values ('Hierachy Update',1)
简单来说,如果您在SQL Server上收到此错误,则运行此查询-
SET IDENTITY_INSERT tableName ON
这仅在单个数据库表中工作,
例如,如果表名是student,则查询如下 SET IDENTITY_INSERT student ON
如果您在Web应用程序上遇到此错误或使用实体框架,则首先在SQL Server上运行此查询并更新您的实体模型(
.edmx file
) 并构建您的项目,此错误将得到解决
小心将IDENTITY_INSERT设置为ON。除非数据库处于维护模式并设置为单用户,否则这是一个不好的做法。这不仅会影响您的插入内容,还会影响其他尝试访问该表的人。
您为什么要在身份字段中输入一个值?
基本上有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时,可以将新记录插入表中而不会出现错误。绝不能在“ INSERT INTO”语句中出现主键“ 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');
表[dbo]的输出。[人]为:
ID LastName FirstName
1 DOE Jane
2 BROWN JOE
2)在第二个示例中,当IDENTITY_INSERT为ON时,可以将新记录插入表中而不会出现错误。只要ID值不存在,则必须从“ INSERT INTO”语句中提供主键“ ID”:如果在这种情况下INSERT中不存在ID,则将收到错误消息“ Explicit value必须为为标识列表指定...”
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]的输出。[人]为:
ID LastName FirstName
1 DOE Jane
2 BROWN JOE
3 BLACK JACK
5 WHITE JOHN
在该表的实体中,将DatabaseGenerated
属性添加到设置了身份插入的列上方:
例:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int TaskId { get; set; }
DatabaseGeneratedOption.Identity
,但仍然出现错误。这是我自己的错,我将伪ID放在新行中以在网页上将它们彼此区分开,并且我希望在insert
足够之前先将其无效。
例如,如果您的表名是School,则可以简单地使用此语句。在插入之前,请确保将identity_insert设置为ON,然后在插入查询之后将 identity_insert设置为 OFF
SET IDENTITY_INSERT School ON
/*
insert query
enter code here
*/
SET IDENTITY_INSERT School OFF
如果您使用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>
另一种情况是检查主键是否与您的班级相同,唯一的区别是主键上附加了“ ID”,或在主键上指定与主键无关的[Key]。类被命名。
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
在PrimaryKey列中添加以下代码行并确保将其设置为数据类型int来更正此错误。如果列是主键,并且在SQL中将IsIDentity设置为true,则不需要此代码行[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
最好的解决方案是使用注解GeneratedValue(strategy = ...)
,即
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column ...
private int OperationID;
它表示,此列是由数据库使用IDENTITY策略生成的,您无需担心-数据库会做到这一点。
如果在使用带有sequelize-typescript npm的sql-server时遇到此问题,请确保添加@AutoIncrement
到ID列:
@PrimaryKey
@AutoIncrement
@Column
id!: number;
每当我想向数据库中添加任何内容时,我都通过创建一个新对象来解决此问题。
请注意,如果要使用来关闭每一行;
,则该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
命令仅适用于事务,并且;
表示事务结束。
如果使用接口并以通用方式实现savechanges的方法,则使用非类型化DBContext或DBSet会引起问题
如果是这种情况,我建议例如强类型化DBContex
MyDBContext.MyEntity.Add(mynewObject)
然后.Savechanges
会工作
只需删除拖动到您的.dbml文件中的表,然后再次将其重新拖动即可。然后清洁解决方案>重建解决方案>生成解决方案。
那对我有用。
我没有自己制作表格,我使用的是VS和SSMS,我点击了此链接以获取ASP.NET身份:https : //docs.microsoft.com/zh-cn/aspnet/identity/overview/getting-started/将ASPNET身份添加到一个空的或现有的Web窗体项目中