如何在SQL Server中向列添加标识?

时间:2011-12-28 16:25:42

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

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

我可以添加主键但无法添加标识。当我在设计师中做这件事的时候,它一直都是超时的。甚至我将设置时间设置为0.

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

任何人都可以告诉我这样的大桌子最好的方法是什么,没有额外的过热?

4 个答案:

答案 0 :(得分:11)

无法IDENTITY添加到现有列。它无法完成。

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

另外:我会在视觉设计器中这样做 - 这会尝试使用新结构重新创建表格,复制所有数据(所有数千万行) ),然后放下旧桌子。

使用直接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。

答案 1 :(得分:4)

好。我能够使用1000万条记录向现有主列添加标识。花了我大约30分钟。

步骤:

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

  2. 以设计师模式打开表格

  3. 进行更改。不保存

  4. 单击Generate Change Script按钮(通常位于Object Explorer上方)

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

  9. 完成。现在您的专栏具有标识:)

答案 2 :(得分:4)

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

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

答案 3 :(得分:2)

设置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'