Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server-更改PK数据类型的最佳方法是什么?_Sql Server_Database_Sql Server 2005_Primary Key - Fatal编程技术网

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

Sql server SQL Server-更改PK数据类型的最佳方法是什么?,sql-server,database,sql-server-2005,primary-key,Sql Server,Database,Sql Server 2005,Primary Key,我目前有一个数据库,其中包含大约20个参考表,即产品、资产、仓库、用户等。这些信息存储在一个中央数据库中,并下载到路上工程师的PDA中。我数据库中的每个表都有一个UniqueIdentifier的PK,即GUID 经过两年的产品开发,我意识到我从来没有也永远不需要编辑这些参考表格。因此,它们不需要使用唯一标识符作为主键 由于在通过Web服务将所有集合发送到PDA之前,我正在序列化它们,因此由于GUID的长度,实际序列化的数据非常庞大 无论如何,说到这里-我想将表的所有PK都更改为IDENTITY

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

经过两年的产品开发,我意识到我从来没有也永远不需要编辑这些参考表格。因此,它们不需要使用唯一标识符作为主键

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

无论如何,说到这里-我想将表的所有PK都更改为IDENTITY Int。有没有什么简单的方法可以做到这一点,或者我必须先切断所有FK,创建临时表,然后编写一些软件来重新映射数据


提前感谢。

如果您有FK引用您的PK,您会遇到大麻烦。 我猜您使用guid是因为应用程序pda的分布式特性,并且可能最初的目的是从那些pda添加新数据,在这种情况下,guid是理想的。缺点是不能对GUID进行索引

我的建议是不要首先使用identity int。首先,禁用FKs。为对该PK的所有引用添加一个INT-not-identity的新列,即所有具有FK的表。然后,对于每个GUID,在下一个值中创建一个新的int,并根据GUID以及其他表中对GUID的所有引用插入它。然后为整数启用新FKs,然后将PK移到新的整数列。最后删除GUID列,然后重建索引


希望这不是太混乱。

如果你有FK引用你的PK,你就有大麻烦了。 我猜您使用guid是因为应用程序pda的分布式特性,并且可能最初的目的是从那些pda添加新数据,在这种情况下,guid是理想的。缺点是不能对GUID进行索引

我的建议是不要首先使用identity int。首先,禁用FKs。为对该PK的所有引用添加一个INT-not-identity的新列,即所有具有FK的表。然后,对于每个GUID,在下一个值中创建一个新的int,并根据GUID以及其他表中对GUID的所有引用插入它。然后为整数启用新FKs,然后将PK移到新的整数列。最后删除GUID列,然后重建索引


希望不要太混乱。

只要您有一些字段或一组字段是唯一的,您就可以将PK重新分配给该字段。i、 如果你不需要guid,你可能也不需要身份代理键。总体而言,最简单的方法就是在一个或多个唯一的非空现有列上使用PK

否则,只需添加一个标识列并将PK重新分配给它即可。保存修改后的表时,它将填充。然后可以删除具有guid的列

我假设我们正在进行此讨论,因为您的guid列当前未用于任何用途。即使它是另一个表中的FK,如果要连接的列是唯一的,也不需要它

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


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

只要您有一些字段或字段集是唯一的,您就可以将PK重新分配给该字段。i、 如果你不需要guid,你可能也不需要身份代理键。总体而言,最简单的方法就是在一个或多个唯一的非空现有列上使用PK

否则,只需添加一个标识列并将PK重新分配给它即可。保存修改后的表时,它将填充。然后可以删除具有guid的列

我假设我们正在进行此讨论,因为您的guid列当前未用于任何用途。即使它是另一个表中的FK,如果要连接的列是唯一的,也不需要它

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


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

我不明白的是,一方面您声明不需要Id列,但另一方面您通过web服务发送它们

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

更改PK是一项巨大的工作,但借助SQL Compare,它可以
e完成。

我不明白的是,一方面您声明不需要Id列,但另一方面您通过web服务发送它们

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


更改PK是一项巨大的工作,但借助SQL Compare可以完成。

首先-哈哈。我知道贵公司还有很多其他人……'哇-guid很酷,我将在任何地方都使用它们…“至少你认识到这条路线的一个问题

第二,您可能会发现以下命令很有用:

exec sp_MSforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL' 

<do stuff here>

exec sp_MSforeachtable 'ALTER TABLE ? CHECK CONSTRAINT ALL' 

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

首先-哈哈。我认识贵公司的很多其他人……”哇-guid很酷,我将在任何地方都使用它们…“至少你认识到这条路线的一个问题

第二,您可能会发现以下命令很有用:

exec sp_MSforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL' 

<do stuff here>

exec sp_MSforeachtable 'ALTER TABLE ? CHECK CONSTRAINT ALL' 
我会让guid单独使用几个月,以防您需要调整/修复任何东西。在将来的某个时候,您应该能够从ref表中删除guid