Sql 标识种子基于其他表种子值递增

Sql 标识种子基于其他表种子值递增,sql,sql-server-2017,ssms-2018,Sql,Sql Server 2017,Ssms 2018,我正在使用SQL SERVER 2017和SSMS 2018。我已经创建了一些主键为int的表,并启用了is Identity,并为我使用相同方法的所有表设置了Identity Increment=1和Identity Seed=1。但是当我在一个表中添加一条记录时,比如说Lead它的ID是2,然后在表中添加值,比如Followup,那么它的ID是3。 为了更好地理解,我在这里添加了截图 铅表 跟踪表 有什么办法可以避免这种情况吗?我们可以为每个表保留单独的标识吗?对于identity不能保

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

铅表

跟踪表

有什么办法可以避免这种情况吗?我们可以为每个表保留单独的标识吗?

对于
identity
不能保证的内容非常具体:

列上的identity属性不能保证以下内容:

  • 值的唯一性

  • 事务中的连续值

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

  • 值的重用

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

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

如果不希望有间隙,最简单的方法是在查询时指定一个值:

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

如果不关心性能,可以使用
序列
指定值。这比使用
标识
的性能要差。基本上,它需要序列化所有插入以保证插入的属性


我应该注意到,即使使用序列,失败的插入仍然会产生间隙,因此它仍然可能无法满足您的需要。

如果您关心分配给标识列的实际数值,您迟早会失败的。如果你将它们视为恰好适合数字列的不透明标识符,那么你会没事的。@Damien_不信者感谢你的回答。身份是这样工作的吗?。