【问题标题】:How to clear identity column to start value after delete first rows [closed]删除第一行后如何清除标识列以开始值[关闭]
【发布时间】:2011-12-14 07:07:21
【问题描述】:

我有一个小问题。

我有 50 行标识列 id-autoincrement。因此,第一行的 id 为 1,最后一行的 id 为 50。然后,我删除了 1 到 25 的行,现在我有了 id 为 26-50 的行。

问题:

我如何“重新初始化”这行 (26-50) 到 (1-25)?我不需要表格中的空ID。谢谢。

SQL Server 2008

【问题讨论】:

  • 我想不出任何正当理由这样做。
  • 好的,现在我们知道你的想法了 :-)
  • 在我的查询中,我需要使用随机 id 的行,当我生成它时,我需要进行 2 个子查询(选择 min(id),选择 max(id))。如果我有 1 到 25 个,我只需要执行一个查询(选择 max(id))。这就是原因……
  • 您不应该为此使用标识列。如果您的关键值必须与现实世界中的某些事物相关,只需使用 INT 并自己管理这些值。存在标识列以维护唯一值 - 仅此而已。

标签: sql sql-server


【解决方案1】:

EDIT - 使用此命令重新初始化标识列。

TRUNCATE TABLE [tablename]

对于您正在尝试做的事情,您不能/不应该使用标识列。

【讨论】:

  • 这将删除 id 为 26-50 的现有行。
  • 你是对的 - 我没有仔细阅读。我以为他想重新初始化身份列以从 1 开始。
  • 不,只是更新现有的行,但是谢谢。
【解决方案2】:

我不知道你为什么这样做,但它有一种奇怪的气味。如果您尝试返回行号,我建议您使用 row_number 并按 id 排序。例如

SELECT ROW_NUMBER() OVER(ORDER BY ID) AS 'ID', * 

FROM your_table

罗斯

【讨论】:

    【解决方案3】:
    DBCC CHECKIDENT('your_table', RESEED, 0)
    

    下一个值将是你用 + 1 重新设定的值,所以在这种情况下,我将它设置为 0,这样下一个值就是 1。

    更多详情请关注http://msdn.microsoft.com/en-us/library/ms176057.aspx

    【讨论】:

    • 当我在表中添加下一行时,它应该更新我现有的行还是只更改开始 ID?
    • 它不会更新现有的行;它只会更改下一个插入的起始 ID
    • 从技术上讲,如果自创建表以来没有向表中插入任何行,或者如果使用 TRUNCATE TABLE 语句删除了所有行,则在运行 DBCC CHECKIDENT 后插入的第一行使用 new_reseed_value作为身份。否则,插入的下一行使用 new_reseed_value + 当前增量值。
    • 是的,但是我问如何在不删除或从 tmp 存储中复制的情况下更新现有 id。
    【解决方案4】:

    我根本不建议这样做。
    标识列的目的不是生成漂亮的数字,而是生成唯一值来识别您的数据。
    如果标识列在另一个表中被引用,您不能只更改表中的值而不破坏引用。

    如果你还坚持这样做:

    您可以使用DBCC CHECKIDENT:
    SQL Server - reset identity field“重置”身份计数器

    请注意,如果表中仍有数据,则无法执行此操作,如 here 所述。
    您可以通过将数据临时复制到另一个表、重置计数器并再次插入数据来解决此问题,但这不是一种非常优雅的方式。

    【讨论】:

    • 我知道这种方式,复制到 tmp 存储并在此之后添加查询/宏。但我想,mb 是不是太容易解决了。
    猜你喜欢
    • 2011-05-16
    • 2020-04-20
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 2021-07-16
    • 1970-01-01
    • 2017-04-03
    相关资源
    最近更新 更多