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)
Wae*_*oul 54
不要将值赋予OperationID,因为它将自动生成.试试这个:
Insert table(OpDescription,FilterID) values ('Hierachy Update',1)
Run Code Online (Sandbox Code Playgroud)
HLG*_*GEM 40
要非常小心将IDENTITY_INSERT设置为ON.除非数据库处于维护模式并设置为单个用户,否则这种做法很糟糕.这不仅会影响您的插入,也会影响其他任何试图访问该表的插入.
为什么要尝试将值放入身份字段?
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)
小智 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 表示交易结束。
如果您使用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
您的查询中有预先提到的 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)
最好的解决方案是使用注释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() 及其作品进行更改!