IDENTITY SEED 基于其他表的种子值递增

IDENTITY SEED is incrementing based on other tables seed values

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

领先Table

跟进Table

是否有任何选项可以避免这种情况?我们可以为每个 table 保留个人身份吗?[=​​12=]

documentation 非常明确 identity 不保证:

The identity property on a column does not guarantee the following:

  • Uniqueness of the value . . .

  • Consecutive values within a transaction . . .

  • Consecutive values after server restart or other failures . . .

  • Reuse of values

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

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

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

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

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

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

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