【问题标题】:How to add identity to the column in SQL Server?如何向 SQL Server 中的列添加标识?
【发布时间】:2012-01-29 07:39:08
【问题描述】:

我有一个大约 1000 万行的表。我们刚刚使用 SQL Server Management Studio 从另一个数据库导入它。它创建表,但在主键列上没有标识和主键。

我可以添加主键但无法添加身份。当我在设计师中做这件事时,它总是超时。即使我将超时设置设置为 0。

我可能需要创建另一个列集主键和标识,从旧列复制数据,删除旧列并重命名新列。

谁能告诉我在没有额外过热的情况下,对于这么大的桌子,最好的方法是什么?

【问题讨论】:

  • 所以这样的事情给了你一个超时? alter table TableName add ID int identity(1, 1) primary key
  • 您可以使用ALTER TABLE ... SWITCH 几乎立即执行此操作。即使在 1000 万行的表上。
  • @TimLehner:可能不是——他说这让他在视觉设计器中超时——它试图以新格式重新创建表格并复制所有数据——所有 1000 万行.. .... 使用您的 ALTER TABLE 声明,应该轻而易举!

标签: sql sql-server sql-server-2008


【解决方案1】:

您可以将 IDENTITY 添加到现有列。它只是可以做到的。 在 SSMS 中只需转到工具--> 选项--> 设计器--> 表和数据库设计器并取消选中选项阻止保存需要重新创建表的更改。

现在将设计器模式下的标识添加到所需的列并保存。

【讨论】:

    【解决方案2】:

    好的。我能够将身份添加到具有 1000 万条记录的现有主列中。我花了大约 30 分钟。

    步骤:

    1. 将数据库更改为单用户模式(以确保没有其他连接到数据库,可能导致锁定)

    2. 在设计器模式下打开表格

    3. 做出改变。不保存

    4. 单击“生成更改脚本”按钮(通常位于对象资源管理器的左上方)

    5. 复制生成的脚本
    6. 关闭设计器窗口(一次只能运行一个实例)
    7. 打开新窗口
    8. 执行脚本

    9. 完成。现在你的专栏有身份了:)

    【讨论】:

    • 检查脚本。我很肯定它会创建一个新表,复制所有数据,然后删除原始表。
    • 如果你点击了我的链接,本可以在 30 秒内完成!
    【解决方案3】:

    设置identity 列的一种方法是在insert 期间使用set identity_insert 选项。例如,将此表中的id更改为identity

    create table YourTable (id int, value varchar(50))
    

    你可以使用这个脚本:

    -- Create empty table as a copy of the original
    select top 0 * into YourTable_New from YourTable
    
    -- Drop the old ID column
    alter table YourTable_New drop column id
    
    -- Add a new ID column with identity
    alter table YourTable_New add id int identity
    
    -- Copy the old values into the identity column
    set identity_insert YourTable_New on 
    insert YourTable_New (id, value) select id, value from YourTable
    set identity_insert YourTable_New off
    
    -- Drop the old table and rename the new one
    drop table YourTable
    exec sp_RENAME 'YourTable_New' , 'YourTable'
    

    【讨论】:

      【解决方案4】:

      不能IDENTITY 添加到现有列。就是做不到。

      您需要创建一个 INT IDENTITY 类型的 new 列,然后删除您不再需要的旧列(并且可能将新列重命名为旧名称 - 如果这是需要)

      另外:我不会在可视化设计器中执行此操作 - 这将尝试使用新结构重新创建表,复制 所有数据(所有 1000 万行),然后删除旧表。

      使用直接 T-SQL 语句效率更高 - 这将执行“就地”更新、非破坏性(不会丢失数据),并且它不需要在此过程中复制大约 1000 万行...

      ALTER TABLE dbo.YourTable
        ADD NewID INT IDENTITY(1,1) NOT NULL
      

      当您向表中添加INT IDENTITY 类型的新列时,它将自动填充连续的数字。您无法阻止这种情况发生,也无法在以后更新这些值。

      这些选项都不是真的很有用,最后 - 你可能会得到不同的 ID 值....要做到这一点,你必须:

      • 提前创建具有正确结构和IDENTITY 的新表
      • 然后在该表上打开SET IDENTITY_INSERT (yourtable) ON 以允许将值插入到标识列中
      • 从原始来源复制此数据
      • 再次关闭身份插入:SET IDENTITY_INSERT (yourtable) OFF

      只有使用这种方法,您才能在新表的 IDENTITY 列中获得相同的 ID。

      【讨论】:

      • 您可以通过创建具有相同结构的新表(身份属性除外)来将identity 添加到现有列中。将旧表切换到新表,然后删除旧表并重命名表。这使数据页保持不变。
      • 我不同意你的观点。我只是尝试在设计器模式下有 800K 行的表上添加主键和标识列。并成功完成。
      • @MartinSmith:这也适用于两个非分区表??
      • @Andomar - 它只是改变了表元数据。不必将所有行复制到新表中或向所有现有行添加列。 Example code here
      • @German,确实不能将标识列添加到现有表中。如果您使用 SSMS(或类似工具),它可能显示您将其添加到现有表中,但在幕后创建了一个新表并导入了行 - 可能是没有区别的区别在很多情况下。
      猜你喜欢
      • 1970-01-01
      • 2011-04-11
      • 2012-03-13
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      • 2016-05-11
      相关资源
      最近更新 更多