SQL Server - 更改PK数据类型的最佳方法是什么?

时间:2009-01-22 07:45:46

标签: sql-server database sql-server-2005 primary-key

我目前有一个包含大约20个参考表的数据库,例如产品,资产,软件仓库,用户等等。这些信息存储在中央数据库中,并下载到外出工程师的PDA中。我数据库中的每个表都有一个UniqueIdentifier PK(即GUID)。

经过两年的产品开发后,我才意识到我从未做过,也从不需要编辑任何这些参考表。因此,他们不需要将UniqueIdentifiers作为主键。

由于我在通过Web服务将其发送到PDA之前序列化了所有集合,因为GUID的长度,实际的序列化数据非常庞大。

无论如何,要达到目的 - 我想将表格的所有PK改为IDENTITY Ints。有没有简单的方法可以做到这一点,或者我将不得不采取切断所有FK,创建临时表,然后编写一些软件来重新映射数据的方法?

提前致谢。

4 个答案:

答案 0 :(得分:3)

首先 - 大声笑。我知道你们公司里有很多其他人......“哇 - GUID很酷,我会到处使用它们......”至少你认识到走这条路的问题之一。

第二 - 您可能会发现这些命令很有用:

exec sp_MSforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL' 

<do stuff here>

exec sp_MSforeachtable 'ALTER TABLE ? CHECK CONSTRAINT ALL' 

第三 - 它在这里说的东西 -

1) add an int autoincrementing identity column to ref table
2) set the current fk guid in data tables to the db key you just created in step 1
3) rinse/repeat for each ref table/data table combination
4) after all is done, refactor code to use id (int) instead of guid

如果你需要调整/修理任何东西,我会单独留下几个月。在将来的某个时候,您应该能够从ref表中删除guid。

答案 1 :(得分:2)

如果你有FK引用你的PK,那你就麻烦大了。 我猜你是因为应用程序(PDA)的分布式特性而使用GUID,并且可能最初的意图可能是从这些PDA中添加新数据,在这种情况下GUID是理想的。缺点是您无法在GUID上编制索引。

我的建议是不要先使用身份注册。首先,禁用你的FK。为所有对该PK的引用添加一个新的INT(非标识)列(即所有对其具有FK的表)。然后对于每个GUID,创建一个新的int(下一个值)并将其插入guid,并在其他表中引用所有guid。然后为整数打开新的FK,然后将PK转移到新的int列。最后删除GUID列,然后重建索引。

希望这不会太乱。

答案 2 :(得分:0)

只要您有一些独特的字段(或字段集),您就可以将PK重新分配给该字段。即如果你不需要guid,你可能也不需要IDENTITY代理键。最简单的做法就是在一个或多个非空的现有列上使用PK。这是唯一的。

否则,只需添加IDENTITY列并将PK重新分配给它。 (当您保存更改的表时,它将填充。)然后您可以使用guid删除列。

(我假设我们正在进行讨论,因为您的guid列目前没有用于任何内容。即使它是另一个表中的FK,如果您有唯一的列加入,您也不需要它那里,要么。)

如果这些都不符合您的情况,请再次发布更多细节。这可以毫不费力地完成。

(我不确定为什么你认为你的主键需要使用uniqueidentifiers,即使要编辑这些表,BTW。)

答案 3 :(得分:0)

嗯,我不明白的是,一方面你声明你不需要Id列,而另一方面你通过你的网络服务发送它们。

因此,我首先会查看我的查询,以查看所获取的内容,并根据返回的结果集对其进行优化。

改变PK是一项艰巨的任务,但在“SQL Compare”的帮助下,可以做到这一点。