【问题标题】:rearrange the identity column value in sql server重新排列 sql server 中的标识列值
【发布时间】:2014-10-10 13:14:17
【问题描述】:

请帮帮我!我有一个表将一个身份字段的值是, 例如,1、2、4、6、8、10、11 ....等

我想按顺序制作,即1,2,3,4,5,6,7...不使用drop

谢谢

【问题讨论】:

  • 除了下面的答案之外,除了唯一标识一条记录之外,此身份字段不应附加任何含义。它不应该是发票号码或包装号码或任何其他类型的对某人有意义的号码。
  • 你为什么要这样做?

标签: sql-server reset identity-column


【解决方案1】:

你不能。 identity 列不可更新。 (或者至少你不能以任何理智的方式。你可以从表中删除所有行,然后用IDENTITY_INSERT 重新插入它们)

identity 列中的空白也只是生活中的一个事实,最好接受!如果你需要一个连续的数字序列来显示,你可以使用ROW_NUMBER

【讨论】:

  • 身份总是会有差距,它们会用于每条回滚的记录以及以后删除的记录。
【解决方案2】:

没有简单的方法可以做到这一点,也没有理由必须这样做。但是,您可以构建一个视图来提供类似的功能:

CREATE VIEW MyTableView AS SELECT ROW_NUMBER() OVER (ORDER BY Identity) AS RowNum, * FROM MyTable

然后让您的客户从 MyTableView 中进行选择。

如果您需要视图与表同名,以确保向后兼容,您当然可以重命名表,然后使用旧表名创建视图。

【讨论】:

  • 哎呀。完全误读了问题,现在应该修复答案。
【解决方案3】:

您为什么不创建一个新字段,使其从 1 开始作为标识种子,然后删除旧列并重命名新列(然后重新创建所有 FK 引用)。

【讨论】:

  • SQL Server 不允许更改列的标识属性。您需要删除整个原始列并创建一个新的标识列。不能特别保证新的顺序与旧的顺序一致。
  • @Martin - 不正确。通过 SQL Server 2005/2008 管理器中的 UI,您可以更改列删除列的自动编号(标识)属性(通过右键单击选择表并选择“设计”)。
  • 这实际上在幕后重建了整个表。单击工具栏中的“脚本”图标以查看它生成的 SQL。
  • @Martin - 你是对的 :(。我以为我清楚地记得显示“更改列”语句的脚本,但我错了。
【解决方案4】:

我认为这是最好的解决方案.. 如果您喜欢,请尝试...

DECLARE @INC AS INTEGER 
SET @INC = 1 
WHILE (@INC <= 7582) --7582 is rowcount of table
BEGIN
    UPDATE YourTable
    SET    ID = @INC
    WHERE  ID = (
               SELECT MIN(ID) AS T
               FROM   YourTable
               WHERE  ID > @INC
           ) --ID=> Identity column
    SET @INC = @INC + 1
END 

注意:在执行之前,您需要将标识插入到列中。

【讨论】:

    【解决方案5】:

    DBCC CHECKIDENT (, RESEED, )

    ** 这将使数字在输入时加 1 (+1)。即新记录需要下一个为 38,因此使用 37 作为此值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-09
      相关资源
      最近更新 更多