【问题标题】:Next number of IDENT_CURRENT下一个 IDENT_CURRENT
【发布时间】:2017-04-11 02:50:12
【问题描述】:

我想得到IDENT_CURRENT的下一个号码 我用过

select IDENT_CURRENT ('Header') + 1

但是这个给我value = '2'当桌子是空的 当我使用

select IDENT_CURRENT ('Header') 

它会在两种情况下给出value = '1',第一种是表为空,第二种是表有一条记录。 这种情况有什么解决方案还是我必须使用另一种方法? Header Table

桌子:

create table Header (
    VhrNum int primary key identity (1,1),
    Date varchar(50),
    TotVhr varchar (50),
    TotQTY Varchar(50)
)

【问题讨论】:

  • 添加表创建脚本或任何其他可以查看表结构的方式。
  • No no no .... 编辑您的问题并以可读的形式添加。
  • 你想做什么?请记住,如果两个用户同时运行此程序,他们将获得相同的编号,那么他们在尝试插入时会收到 PK 错误。考虑改用序列,或使用insert 来捕获数字
  • 你没事我没注意到我会学习序列并尝试一下谢谢

标签: sql-server tsql


【解决方案1】:

Header 表中插入行的事务可能由于错误或违反约束等而回滚。事务将分配一定范围的 ID,并且在回滚时不会使用该范围(即不会提交行并且不使用 ID)。这将在VhrNum 列中留下一个空白。所以不可能知道下一个身份ID是什么。

您应该了解有关标识列的几件事情,这些事情在the documentation of the IDENTITY property 中有明确说明。我将引用相关的项目符号以供参考:

列上的标识属性保证以下几点:

  • 事务中的连续值 - 插入多行的事务不能保证获得行的连续值 [...]

  • 服务器重启或其他故障后的连续值 [...]

  • 值的重用——对于具有特定种子/增量的给定身份属性,引擎不会重用身份值。如果特定的插入语句失败或插入语句回滚,则使用的标识值将丢失并且不会再次生成。这可能会导致生成后续标识值时出现间隙。


对于标识列,您永远不应该依赖下一个值是什么。无法知道该值是多少。

【讨论】:

  • 谢谢,我现在知道了,但是您建议使用什么代替标识来制作自动增量列,除了序列之外还有其他解决方案,因为我发现它太复杂了,再次感谢您
  • @QaisAl-Rawahneh 这取决于您的要求。你需要一个没有间隙的序列吗?
  • 是的,我需要没有间隙的序列
  • @QaisAl-Rawahneh 您需要一个柜台。我会把你推荐给this answer我在同一个问题上给出的。寻找该答案的第二部分,阐明如何实施计数器表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-18
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-27
相关资源
最近更新 更多