Identity列的值在SQL Server中突然跳到1001。

15 浏览
0 Comments

Identity列的值在SQL Server中突然跳到1001。

我正在使用 Sql server 2012(Denali)。我想知道为什么所有的自增列值都从1001开始。刚开始,Identity列从1、2开始自增,但突然间跳到了1001、1002等等,对于数据库中所有包含自增列的表都是如此。可能的原因是什么?请帮忙解答。

0
0 Comments

在SQL Server中,Identity列的值突然跳到1001的问题可能是由于以下原因引起的:

1. 可能是由于使用了Sequence而不是Identity。Sequence提供了对值的100%完全控制,并且在许多方面与Identity相比更为优越。Identity非常简单和方便,但是可能在某些情况下不够灵活。

解决方法是使用Sequence来替代Identity,并使用Cycle选项来填充可能存在的间隙。

2. 另一个可能的原因是在使用Identity时,即使插入失败,Identity的值仍然会被使用。这意味着即使插入失败,Identity的当前值也可能会被增加。

解决方法是使用Sequence来代替Identity,并根据需要进行错误处理以确保插入成功。

总之,如果遇到Identity列值突然跳到1001的问题,可以考虑使用Sequence来代替Identity,并根据具体情况选择合适的选项来解决该问题。

0
0 Comments

在SQL Server 2012中,微软改变了处理身份值的方式,导致在重新启动SQL Server实例或服务器后,您可能会在记录之间看到身份间隔。这些身份间隔可能是由于安装更新后自动服务器重启等其他原因造成的。

针对这个问题,您可以使用以下两种方法:

1. 使用跟踪标志272

- 这将导致为每个生成的身份值生成一个日志记录。打开此跟踪标志可能会影响身份生成的性能。

2. 使用具有NO CACHE设置的序列生成器

- 在SQL Server 2012上设置跟踪标志272,您可以按照以下步骤操作:

- 打开"SQL Server Configuration Manager"

- 在左侧窗格中点击"SQL Server Services"

- 在右侧窗格上右键单击SQL Server实例名称(默认为SQL Server(MSSQLSERVER))

- 点击"Properties"

- 点击"Startup Parameters"

- 在"specify a startup parameter"文本框中输入"-T272"

- 点击"Add"

- 确认更改

以下是微软在"connect"上回复有关此身份危机问题的引用:

如果您需要与之前版本的SQL Server相同的身份生成语义,有两个选项可用:

- 使用跟踪标志272 => 这将导致为每个生成的身份值生成一个日志记录。打开此跟踪标志可能会影响身份生成的性能。

- 使用具有NO CACHE设置的序列生成器 => 这将导致为每个生成的序列值生成一个日志记录。请注意,使用NO CACHE可能会影响序列值生成的性能。

0
0 Comments

在SQL Server中,如果身份列的值突然跳到1001,可能是以下原因之一:

1. 在2012版本中,为了提高高端机器的性能,引入了对身份值的预分配。这个特性可以通过使用TF 272来禁用。身份属性是单独存储在元数据中的。如果一个值被用作身份,并调用了增量操作,则会设置新的种子值。除了DBCC reseed之外,没有任何操作,包括回滚、故障转移等,可以更改种子值。故障转移只适用于表对象,而不适用于身份对象。因此,在故障转移之前,可以调用checkpoint,但在非计划情况下可能会出现间隙。如果间隙是一个问题,我建议你使用TF 272。

2. 对于控制管理器关闭,我们在下一个版本中有一个修复方法(使用另一个TF)。这个修复方法将处理大多数控制管理器关闭的情况。

为了避免这种情况的发生,可以按照连接项中的评论中所描述的启用TF 272。

另外,如果你关心数值的顺序,你可能在错误地使用身份列。如果身份列达到int.Max,超过的ID将不会自动使用,一切都会停止。

对于有轻微强迫症的人来说,将主键从6跳到1001可能会让人沮丧。

要避免身份列值突然跳到1001的情况,可以通过启用TF 272来禁用身份值的预分配。另外,如果关心数值的顺序,需要正确使用身份列,并且要注意身份列达到最大值时的处理方式。

0