向具有许多记录的表添加主键

Posted

技术标签:

【中文标题】向具有许多记录的表添加主键【英文标题】:Add primary key to a table with many records 【发布时间】:2011-01-14 07:42:12 【问题描述】:

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

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

然后输出错误:

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

我想在我的桌子上进行 PK。

如何添加?

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

这提供了原始 SQL(安全地包装在事务中),您可以将其复制到剪贴板,将其作为新查询(左上角按钮,或文件 > 新建 > 带有当前连接的查询)运行,然后将其粘贴到,选择正确的数据库并执行查询。

【讨论】:

这样你可能会在一段时间内出现磁盘空间不足的情况。 不知道这个过程。谢谢@chris【参考方案3】:

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

【讨论】:

这对我来说效果很好。可能有更好的方法,但这是一个快速解决方案。 我认为首选(也是最简单的)解决方案是更改设计超时设置,如described in MSDN here。 不能总是保证有空间来做这件事。【参考方案4】:

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

【讨论】:

【参考方案5】:

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

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

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

【讨论】:

【参考方案6】:

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

在“Designers”和“Table and Database Designers”下,更改“Transaction timeout after” 价值。默认值为 30,0 表示无限。增加值后尝试创建主键。

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

更新 添加屏幕截图

【讨论】:

在 SSMS 2008 R2 中,您不能设置 'Transaction time-out after' = 0。 这个答案可能是微软的偏好:support.microsoft.com/en-us/kb/915849

以上是关于向具有许多记录的表添加主键的主要内容,如果未能解决你的问题,请参考以下文章

组合主键及JPA映射

SQL语句删除和添加外键主键

SQL Server 如何添加删除外键主键,以及更新自增属性

允许从重复记录中的一条记录到具有主键的表中

做java项目时的主键和外键是啥啊?

数据库—超键候选键主键外键