25

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

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

然后输出错误:

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

我想PK到我的桌子上。

我怎样才能添加它?

4

6 回答 6

34

如果在 Management Studio 中您在设计视图中设置主键(不保存),当您下次右键单击时,您有一个选项“生成更改脚本” - 此选项也可在顶部的“表设计器”菜单中使用。

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

于 2010-02-08T10:31:06.747 回答
19

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

在“设计器”和“表和数据库设计器”下,更改“事务超时后”值。默认值为 30,0 表示无限。增加值后尝试创建主键。

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

更新 添加截图 在此处输入图像描述

于 2014-05-18T22:59:13.257 回答
11

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

于 2010-02-08T10:32:33.663 回答
2

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

于 2010-02-08T10:29:18.870 回答
0

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

于 2010-02-08T10:50:44.460 回答
0

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

由于表加载了批量插入,因此最好的选择是截断表(截断表 MYTBL);更改它,添加 ID(更改表 TBL 添加 ID int 身份主键)并重新发出批量加载。

如果您无法重新填充表格,您可以使用 stamp 或 hassan 解决方案来更改表格。

于 2010-02-08T10:51:21.900 回答