我目前有一个包含大约20个参考表的数据库,例如产品,资产,软件仓库,用户等等。这些信息存储在中央数据库中,并下载到外出工程师的PDA中。我数据库中的每个表都有一个UniqueIdentifier PK(即GUID)。
经过两年的产品开发后,我才意识到我从未做过,也从不需要编辑任何这些参考表。因此,他们不需要将UniqueIdentifiers作为主键。
由于我在通过Web服务将其发送到PDA之前序列化了所有集合,因为GUID的长度,实际的序列化数据非常庞大。
无论如何,要达到目的 - 我想将表格的所有PK改为IDENTITY Ints。有没有简单的方法可以做到这一点,或者我将不得不采取切断所有FK,创建临时表,然后编写一些软件来重新映射数据的方法?
提前致谢。
答案 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”的帮助下,可以做到这一点。