我有一张大约1000万行的表。我们刚从SQL Server Management Studio的另一个数据库导入它。它创建表但主键列上没有标识和主键。
我可以添加主键但无法添加标识。当我在设计师中做这件事的时候,它一直都是超时的。甚至我将设置时间设置为0.
我需要创建另一个列集主键和标识,复制旧数据,删除旧列并重命名新列。
任何人都可以告诉我这样的大桌子最好的方法是什么,没有额外的过热?
答案 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分钟。
步骤:
将数据库更改为单用户模式(以确保没有与数据库的其他连接,可能导致锁定)
以设计师模式打开表格
进行更改。不保存
单击Generate Change Script按钮(通常位于Object Explorer上方)
执行脚本
完成。现在您的专栏具有标识:)
答案 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'