给一个有很多记录的表添加主键

25

我在SQL Server 2005中有一张包含10000054条记录的表;这些记录是通过批量插入操作插入的。该表没有主键,我想要一个主键。如果我尝试修改表的结构,添加一个名为PK且设置为int类型的新列,管理控制台会发出警告:

"对于包含大量数据的表进行更改可能需要相当长的时间。在保存更改时,表数据将无法访问。"

然后输出错误:

" 无法修改表格。 超时已过期。操作未能在完成之前超时或服务器没有响应。 "

我想在我的表中加入一个主键。

我该如何添加它?

6个回答

37

如果在Management Studio中,在Design视图下设置了主键(未保存),那么下次右键单击时将显示“生成更改脚本”选项。该选项也可在顶部的“Table Designer”菜单上使用。

这提供了原始的SQL(安全地包装在一个事务中),您可以将其复制到剪贴板,将其转到“新查询”(左上角的按钮或“文件”>“新建”>“使用当前连接”的查询),粘贴进去,选择正确的数据库并执行查询。


这样做可能会暂时导致磁盘空间不足。 - iMatoria
不知道这个过程。谢谢@chris - Sadid Khan

21

我知道这篇文章比较旧,但我碰到了同样的问题并以不同的方式解决了它。假设你使用的是SSMS 2008,你可以进入 工具 --> 选项

在 '设计人员' 下面 '表和数据库设计人员', 改变 '事务超时时间' 的值, 默认值为30,0表示无限制。在增加该值后尝试创建主键。

这通常比以下步骤更快:创建一个新的数据库,复制数据,删除旧的数据库,并将新的数据库重命名为旧的数据库。 在应用主键后,您还可以将超时设置为30 - 如果您希望的话,这是您的选择。

更新 添加截图 enter image description here


4
在SSMS 2008 R2中,您无法将“事务超时时间”设置为0。 - Tony L.
4
这个答案可能是微软的首选:https://support.microsoft.com/zh-cn/kb/915849 - Tony L.

11

创建一个与原表格结构完全相同的新表,并将所需列设置为主键。现在使用select语句将记录从一张表复制到另一张表。完成后,删除旧表并将此新表重命名为所需名称。


这对我很有效。可能有更好的方法,但这是一个快速解决方案。 - Induster
我认为首选(也是最简单的)解决方案是更改设计超时设置,如MSDN中所述 - Veverke
1
不能保证总是有足够的空间来执行此操作。 - Robino

2

尝试从SQL查询窗口生成SQL脚本并执行它。


0

你可以创建一个带有主键的表。当使用 bcp 插入数据时,你可以使用格式文件来映射列。批量复制的格式文件是一个很好的解决方案。 使用这种解决方案,你可以插入带有标识信息的数据。


0

从您对David的回复中,我了解到您没有适合作为主键的列。在这种情况下,您可以将int identity添加为表的最后一列,批量插入将继续工作。

由于表是通过批量插入加载的,最好的选择是截断表(truncate table MYTBL);修改它,添加ID(alter table TBL add ID int identity primary key),然后重新发出批量加载。

如果您无法重新批量处理表,则可以使用stamp或hassan的解决方案来修改表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接