【问题标题】:IDENTITY SEED is incrementing based on other tables seed valuesIDENTITY SEED 基于其他表种子值递增
【发布时间】:2020-12-14 07:14:32
【问题描述】:

我正在使用 SQL SERVER 2017 和 SSMS。我创建了一些主键为 int 并启用 Is Identity 并设置 Identity Increment = 1 and Identity Seed=1 的表表我使用了相同的方法。但是当我在表中添加一条记录时说 Lead 它的 ID2,然后向表中添加值说 Followup 那么它的 ID3。 在这里我添加屏幕截图以便更好地理解

铅表

跟进表

有什么办法可以避免这种情况吗?我们可以为每个表保留身份个体吗?

【问题讨论】:

  • 如果您关心分配给标识列的实际数值,迟早您会遇到困难。如果您将它们视为恰好适合数字列的不透明标识符,那么您往往会没事。
  • @Damien_The_Unbeliever 感谢您的回复。 Identity 是这样工作的吗?

标签: sql sql-server-2017


【解决方案1】:

documentation 非常具体地说明了identity 不保证

列上的标识属性不保证以下内容:

  • 值的唯一性。 . .

  • 交易中的连续值。 . .

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

  • 价值观的重用

一般来说,“唯一性”属性不是问题,因为标识列通常是主键(或通常至少声明为unique),这确实保证了唯一性。

identity 列的目的是提供一个不同于其他行的唯一数字标识符,因此它可以很容易地用作主键。没有其他保证。为了提高性能,SQL Server 有许多导致差距的捷径。

如果你想要没有间隙,那么最简单的方法是在查询时赋值:

row_number() over (order by <identity column>)

这不是 100% 令人满意,因为删除会影响值。我还认为在并行系统上,插入也可以(因为身份可能会缓存在各个节点上)。

如果您不关心性能,可以使用sequence 来分配值。这比使用identity 的性能要差。基本上,它需要对所有的插入进行序列化,以保证插入的属性。

我应该注意,即使有一个序列,失败的插入仍然会产生间隙,所以它仍然可能无法达到你想要的效果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多