1

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

经过 2 年的产品开发,我意识到我从不做也永远不需要编辑这些参考表中的任何一个。因此,他们不需要将 UniqueIdentifiers 作为主键。

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

无论如何,切入正题 - 我想将表的所有 PK 更改为 IDENTITY Ints。有什么简单的方法可以做到这一点,还是我必须按照切断所有 FK,创建临时表,然后编写一些软件来重新映射数据?

提前致谢。

4

4 回答 4

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

以防万一您需要调整/修复任何东西,我会让向导单独待几个月。在将来的某个时候,您应该能够从您的参考表中删除 guid。

于 2009-01-22T08:25:35.573 回答
2

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

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

希望这不是太乱码。

于 2009-01-22T07:55:46.973 回答
0

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

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

(我假设我们正在讨论这个问题,因为您的 guid 列当前没有用于任何事情。即使它是另一个表中的 FK,如果您有唯一的列要加入,您也不需要它.)

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

(我不确定为什么您认为即使要编辑表,您的主键也需要唯一标识符,顺便说一句。)

于 2009-01-22T07:56:05.320 回答
0

好吧,我不明白的是,一方面您声明您不需要 Id 列,但另一方面您正在通过您的网络服务发送它们。

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

更改 PK 是一项艰巨的任务,但在“SQL 比较”的帮助下,它可以完成。

于 2009-01-22T07:57:37.343 回答