2010-02-08 46 views
13

我在SQL Server 2005中有一个包含10000054条记录的表;这些记录是通过批量插入操作插入的。该表不包含主键,我想拥有一个主键。如果我尝试修改表的结构,添加一个新的列PK,将其设置为带有isidentity的int,则管理控制台会给我一个警告:将主键添加到包含多条记录的表中

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

然后输出误差:

“ 无法修改表 超时过期超时时间已过之前的操作的完成或服务器未响应 ”

我想要一个PK进入我的桌子。

我该如何添加它?

回答

8

使用精确模式创建一个新表,并将所需列作为主键。现在使用select来插入将记录从一个表复制到另一个表。 完成后,删除旧表并将该新表重命名为所需的名称。

+0

这对我很好。可能有更好的方法,但这是一个快速解决方案。 – Induster

+0

我认为首选(也是最简单的)解决方案正在改变设计超时设置,如[在此处的MSDN中所述](https://support.microsoft.com/zh-cn/kb/915849)中所述。 – Veverke

+0

不能总是保证有空间做到这一点。 – Robino

2

尝试生成SQL脚本并从SQL查询窗口发出。

22

如果在Management Studio设置在设计视图中的主键(不保存),当您下一次右击你有一个选择“生成更改脚本” - 这个选项也可在该“表设计器”菜单上最佳。

这提供了可以复制到剪贴板的原始SQL(安全地包装在事务中),将其作为新查询(左上角的按钮,或File> New> Query with Current Connection),粘贴在,选择正确的数据库并执行查询。

+0

这样你可能会缺少一段时间的磁盘空间。 – iMatoria

0

你可以制作一个带有主键的表格。当使用bcp插入数据时,可以使用格式文件来映射列。格式文件批量复制是一个很好的解决方案。 使用此解决方案,您可以使用身份信息插入数据。

0

从您回应大卫,我得到你没有主键合适列。在这种情况下,您可以添加一个int标识作为表的最后一列,批量插入将继续工作。

如该表被装入一个批量插入最好的办法是截断表(截断表MYTBL);修改它,添加ID(更改表TBL添加ID int标识主键)并重新发出批量加载。

如果不能rebulk表,你可以用邮票或哈桑的解决方案,以改变该表。

9

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

在'设计师'然后'表和数据库设计师'下,更改'交易超时' 值。默认值是30,0表示无限。尝试在增加值后创建主键。

这往往比起来要快得多;创建一个新的数据库,复制数据,删除旧的数据库,并将新的数据库重命名为旧的数据库。完成主键的使用后,您可以将超时设置回30,如果您愿意,也可以选择。

+1

在SSMS 2008 R2中,您无法设置'0'后的事务超时。 –

+1

此答案可能是Microsoft的首选项:https://support.microsoft.com/en-us/kb/915849 –

相关问题