将IDENTITY转换为数据类型tinyint的算术溢出错误

时间:2014-11-20 13:34:08

标签: sql sql-server tsql sql-server-2008-r2 auto-increment

我正在设计SQL Server 2008 R2 SP2 Express数据库中的表。我为数据创建了nvarchar列的表,为自动递增标识创建了tinyint列,假设行数不会超过几行(这就是为什么我选择0-255 tinyint)。当我添加超过255行时,即使在删除该表中的所有行并尝试添加一个新行之后,此错误仍会永久发生。我正在使用SQL Server Management Studio Express执行此操作。

  1. 如何强制数据库引擎检查哪些索引是免费的?
  2. 如果我将tinyint更改为int并达到int数字的限制,会发生这种情况吗?

2 个答案:

答案 0 :(得分:9)

添加255行后,想要删除表中的所有行,但增量列的计数器已经设置为255,即使删除了所有行。

要解决此问题,您需要在删除所有行后重置增量列的计数器。删除所有行时请使用以下查询,以便计数器将重置为重置为0.执行此查询后,您可以在表中添加增量列值为1或在表设计时设置的行。

DELETE FROM [TestTable]

DBCC CHECKIDENT ('[TestTable]', RESEED, 0)
GO

如果要删除表中的所有行,也可以使用truncate table命令。截断命令还将增量列重置为初始值。

Truncate Table [TestTable]

答案 1 :(得分:4)

  

...即使我删除了该表中的所有行

标识的一点是,它将增加最后指定的值,而不管删除是什么,因此只要超过标识类型的容量,该错误就是永久性的。

  

如果我将tinyint更改为int并达到int number的限制,是否会发生这种情况?

是的,任何可能溢出的类型都会发生。

  

如何强制数据库引擎检查哪些索引是免费的?

这会破坏身份的目的,因为您将重复使用以前的值。