我在SQL Server 2005中有一个包含10000054条记录的表;这些记录通过批量插入操作插入。该表不包含主键,我想要一个。如果我尝试修改表的结构,添加一个新列PK,设置为int with isidentity,管理控制台会给我一个警告:
“对包含大量数据的表的更改可能需要相当长的时间。在保存更改时,将无法访问表数据。”
然后输出错误:
” 无法修改表格。 超时已过期。操作完成之前经过的超时时间或服务器没有响应。 “
我想把PK放到我的桌子里。
如何添加?
答案 0 :(得分:26)
如果在Management Studio中您在“设计”视图中设置主键(不保存),则在下次右键单击时有一个选项“生成更改脚本” - 此选项也可在顶部的“表设计器”菜单中找到
提供原始SQL(安全地包装在事务中),您可以将其复制到剪贴板,将其作为新查询运行(按钮左上角,或文件>新>使用当前连接查询),粘贴在其中,选择正确的数据库并执行查询。
答案 1 :(得分:12)
我知道这已经老了,但我遇到了这个并以不同的方式解决了它。假设您正在使用SSMS 2008,您可以进入工具 - > 选项的
<&#39; 设计师&#39;然后&#39; 表和数据库设计师&#39;,在&#39;之后更改&#39; 交易超时 值。默认值为30,0为无限。尝试在增加值后创建主键。
这比往往要快得多;创建新数据库,复制数据,删除旧Db并将新数据库重命名为旧数据库。在您完成应用主键后,您也可以将超时设置为30 - 如果您愿意,可以选择。
答案 2 :(得分:8)
创建一个具有精确架构的新表,并将所需列作为主键。现在使用select来将记录从一个表复制到另一个表。 完成后,删除旧表并将此新表重命名为所需名称。
答案 3 :(得分:2)
尝试生成SQL脚本并从SQL Query窗口发出它。
答案 4 :(得分:0)
你可以用主键创建一个表。使用bcp插入数据时,您可以使用格式文件来映射列。批量复制的格式文件是一个很好的解决方案。 使用此解决方案,您可以插入带有身份信息的数据。
答案 5 :(得分:0)
从你回复大卫我得到你没有合适的主键列。在这种情况下,您可以添加一个int标识作为表的最后一列,批量插入将继续工作。
由于表加载了批量插入,最好的选项是截断表(truncate table MYTBL);改变它,添加ID(alter table TBL add ID int identity primary key)并重新发出批量加载。
如果您不能重新制作桌子,可以使用印章或哈桑解决方案来改变桌子。