首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >即使操作失败,标识字段也会增加您的值,这是正常的吗?

即使操作失败,标识字段也会增加您的值,这是正常的吗?
EN

Stack Overflow用户
提问于 2014-01-07 13:31:33
回答 1查看 221关注 0票数 0

我使用迁移在Server数据库中使用Update-Database命令为我的表添加种子。但是,当该进程由于某种原因(例如FK问题)失败时,具有自动增量ID的我的模型将增加它们的种子。

举个例子..。

具有自动增量ID的示例模型:

代码语言:javascript
运行
复制
public class Person
{
    public int Id { get; set; }

    public string Name { get; set; }
}

我们可以在Configuration.cs中通过以下方式为该模型添加种子:

代码语言:javascript
运行
复制
context.Persons.AddOrUpdate(t => t.Name,
    new Person { Name = "Alex" },
    new Person { Name = "Louis" },
    new Person { Name = "Willian" }
);

假设我的数据库是空的,当我运行Update-Database时,我将在Person表(Alex、Louis、Willian)中有3行if 1、2和3。但是如果在这个过程中发生了一些失败,并且我再次运行了Update-Database,但现在成功了,那么if将是4、5和6。

要纠正这个问题,我需要通过SQL重新分配identity字段。

这是正常的行为吗?我可以做些什么来维护从1开始的顺序ID,而不删除标识属性和修复ID值?有更好的方法来填充我的桌子吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-07 14:01:36

是的,这就是身份列的工作方式。标识列不能保证单调递增的数字。它只是根据需要按顺序分配数字,这样您就不必这样做了。

标识的分配可以在事务失败之前进行。即使不使用这些值,标识仍然会增加。如果您试图通过重置值来更正该值,则会导致冲突。

例如,使用标识1、2和3插入行1、2和3,然后进行回滚,因此从表中删除行。同时插入4、5和6。你看到1,2,3失踪了,所以你把身份设置回原来的位置。当插入1、2和3时,标识现在为4,因此下一个insert将有一个重复的主键。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20972936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档