【问题标题】:SQL Server: how to add new identity column and populate column with ids?SQL Server:如何添加新的标识列并用 id 填充列?
【发布时间】:2012-03-13 23:07:00
【问题描述】:

我有一张包含大量数据的表格。我想添加额外的列 id 并将其用作主键。用1row count 的值填充此列的更好方法是什么

目前我正在使用游标并一一更新行。这需要几个小时。有没有办法更快?

谢谢

【问题讨论】:

    标签: sql sql-server primary-key database-cursor


    【解决方案1】:

    就这样吧:

    ALTER TABLE dbo.YourTable
    ADD ID INT IDENTITY(1,1)
    

    并且该列将被创建并自动填充integer 值(正如 Aaron Bertrand 在他的评论中指出的那样 - 您无法控制哪一行获得什么值 - SQL Server 自己处理它并且你不能影响它。但所有行都会得到一个有效的 int 值 - 不会有任何 NULL 或重复值)。

    接下来,将其设置为主键:

    ALTER TABLE dbo.YourTable
    ADD CONSTRAINT PK_YourTable PRIMARY KEY(ID)
    

    【讨论】:

    • 我更喜欢 id。 WidgetID 听起来像一个外键。所以我希望他不要
    • @KM。 - 这有待商榷。表Person 是否应该有一个名为IDPersonID 的PK。没有答案,是偏好、环境标准,但肯定不是普遍认同的。
    • @Dems 我个人的看法是,无论在架构中的哪个位置引用它,它都应该是PersonID。但这是一个不同问题的讨论,可能不在这个网站上。 :-)
    • @KM 我希望你不要在每一列前加上表名。如果是PersonID,那为什么不也PersonFirstNamePersonLastName..?
    • @Blorgbeard,这个想法是你最终在多个表中使用“ID”列作为外键。因此,最好在两个表中使用相同的列名 (PersonID)。在具有许多表和大量 tsql 代码的大型系统中,外键具有不同的名称可能会非常痛苦。
    【解决方案2】:

    如果您想按特定顺序添加行号,您可以将 ROW_NUMBER() 执行到新表中,然后删除原始表。但是,根据表大小和其他业务限制,您可能不想这样做。这也意味着存在您希望对表格进行排序的逻辑。

    SELECT ROW_NUMBER() OVER (ORDER BY COL1, COL2, COL3, ETC.) AS ID, *
    INTO NEW_TABLE
    FROM ORIGINAL_TABLE
    

    【讨论】:

      猜你喜欢
      • 2015-07-18
      • 1970-01-01
      • 2012-01-29
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      • 2013-08-11
      相关资源
      最近更新 更多