【问题标题】:Arithmetic overflow error converting IDENTITY to data type tinyint将 IDENTITY 转换为数据类型 tinyint 的算术溢出错误
【发布时间】:2015-01-18 09:26:32
【问题描述】:

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

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

【问题讨论】:

  • 这是IDENTITY 列的范围用完时发生的错误 - 无论该列具有什么数据类型。但是:使用INT,您至少可以获得 2 十亿 个可能的值 - 这应该比您现在用完的 255 个持续时间更长......

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


【解决方案1】:

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

标识的意义在于,无论删除如何,它都会递增最后分配的值,因此一旦超出标识类型的容量,该错误就会永久存在。

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

是的,任何可以溢出的类型都会发生这种情况。

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

这有点违背身份的目的,因为您将重用以前的值。

【讨论】:

    【解决方案2】:

    一旦添加了 255 行,然后想从表中删除所有行,但增量列的计数器已经设置为 255,即使在删除所有行之后也是如此。

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

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

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

    Truncate Table [TestTable]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多