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 它的 ID 是 2,然后将值添加到 table 说 Followup 然后它的 ID 是 3。
在这里我添加了屏幕截图以便更好地理解
领先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
的性能要差。基本上,它需要序列化所有插入以保证插入的属性。
我应该注意,即使有一个序列,失败的插入仍然会产生间隙,因此它仍然可能无法达到您想要的效果。
我正在使用 SQL SERVER 2017 并使用 SSMS。我创建了一些 tables,其主键是 int 并启用 Is Identity 并设置 Identity Increment = 1 和 Identity Seed=1 对于所有 table 我都使用了相同的方法。但是当我在 table 中添加一条记录时,说 Lead 它的 ID 是 2,然后将值添加到 table 说 Followup 然后它的 ID 是 3。 在这里我添加了屏幕截图以便更好地理解
领先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
的性能要差。基本上,它需要序列化所有插入以保证插入的属性。
我应该注意,即使有一个序列,失败的插入仍然会产生间隙,因此它仍然可能无法达到您想要的效果。