Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.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 作为主键从int移动到guid_Sql_Sql Server_Foreign Keys_Primary Key_Guid - Fatal编程技术网

Sql 作为主键从int移动到guid

Sql 作为主键从int移动到guid,sql,sql-server,foreign-keys,primary-key,guid,Sql,Sql Server,Foreign Keys,Primary Key,Guid,我使用了几个带有整数主键的引用表。现在我想将int更改为guid,保留所有引用。最简单的方法是什么 谢谢大家! 添加 我确实了解整个流程,所以我需要更详细的建议,例如,如何填写新的GUID列。使用默认值newid()是正确的,但是对于已经存在的行怎么办?首先:亲爱的上帝,为什么 其次,您必须首先将GUID列添加到所有表中,然后根据int值填充它们。完成后,可以将guid设置为主键/外键,然后删除int列 要更新值,您可以执行以下操作 在主键表中设置新的GUID 运行以下命令: 是的,我和格伦在

我使用了几个带有整数主键的引用表。现在我想将int更改为guid,保留所有引用。最简单的方法是什么

谢谢大家!

添加


我确实了解整个流程,所以我需要更详细的建议,例如,如何填写新的GUID列。使用默认值newid()是正确的,但是对于已经存在的行怎么办?

首先:亲爱的上帝,为什么

其次,您必须首先将GUID列添加到所有表中,然后根据int值填充它们。完成后,可以将guid设置为主键/外键,然后删除int列

要更新值,您可以执行以下操作

  • 在主键表中设置新的GUID
  • 运行以下命令:

  • 是的,我和格伦在一起。。。实际上,在他发布之前,我还在犹豫是否发布同样的东西

    为什么不希望自动递增int主键与GUID分开?它更加灵活,而且您只需将GUID列编入索引,就可以在查询中获得良好的性能


    至于灵活性,我喜欢将我的id保留为自动递增整数,因为这样,其他看起来唯一且主键重要的项就可以更改


    灵活性的一个很好的例子是使用用户名作为主键。即使它们是独一无二的,能够改变它们也很好。如果用户使用电子邮件地址作为用户名会怎样?能够更改用户名并且不影响您的所有查询是一个很大的优势,我怀疑您的guid也是如此……

    我认为,您必须手动操作。或者您可以为它编写一些实用程序。情景应该是:

    • 使用新的“guid”列复制“int”PK/FK列
    • 为“guid”PK列生成新值
    • 使用指定的值更新“guid”FK列中的值(通过“int”PK查找记录)
    • 删除带有“int”PK/FK列的引用(关系)
    • 创建具有“guid”PK/FK列的类似引用(关系)
    • 删除“int”PK/FK列
        • 为guid创建一个新列 主表中的值。使用 uniqueidentifier数据类型,将其设置为 不为null,带有newid()默认值 将填充所有现有行
        • 创建新的uniqueidentifier列 在子表中
        • 运行update语句以使用现有的int关系来引用实体来构建公会关系
        • 删除原始的int列

        此外,在数据/索引页中留一些空间(指定fillfactor<100),因为guid不像int-identity列那样是连续的。这意味着插入可以位于数据范围内的任何位置,如果页面已满100%,则会导致页面拆分。

        这与实现分布式计算模型的系统相关。如果在系统中保存信息时要求系统知道主键,则使用由ONE处理程序维护的自动递增主键将降低系统速度。相反,您需要一种类似GUID生成器的机制来创建主键(请记住,主键的真正特性是它的唯一性)。因此,我可以使用多个服务进行扩展,每个服务独立地创建其主键

        我以前有过这样做的特权,基本上我要做的就是将整个该死的数据库导出到XML中。接下来,我有一个Java应用程序,它使用Java.util.Random的nextLong()函数将主键替换为新的guid键。在那之后,我把整个东西导入数据库


        当然,在我第一次尝试重新导入XML文件时,我忘了关闭主键字段的自动编号功能,所以一定要从错误中吸取教训。我确信有更好的方法,但这是一种快速而肮脏的方法。。。它成功了。如果你想知道,这个项目是为了扩大应用规模。

        这是一个很好的选择。对于我的一个应用程序,我从longs切换到UUID,我并不后悔。如果您使用MS SQL Server,它将包含在标准中(我使用postgresql,从8.3版开始,它仅包含在标准中)


        如所述,您可以根据当前记录中的密钥重新创建UUID。请注意,它们不是唯一的,但这样很容易保持关系的完整性。移动后创建的新记录将是唯一的。

        不要这样做!我们开始使用guid,现在我们几乎完成了将INTs作为PKs的迁移;我们保留GUID用于日志记录(对于一些表,呃,“可协商的关系完整性”),但是使用ints的速度提高了很多

        注意,只有当桌子上的行数达到数百万时,这一点才变得明显


        到目前为止,我们最大的愚蠢行为是使用NEWID()作为(顺序)日志表的主键-当我们意识到我们的错误时,有很多人大吃一惊。

        我同意格伦的观点。对于PKs,我将坚持使用整数。如果需要更多记录,请使用bigint。如果您需要全局标识符,请使用类似URI的内容作为辅助键,并坚持使用ints作为PKs。但是如何在主键表中设置新的guid?2 Alexander Prokofyev:将所有“guid”PK列的默认子句设置为“newid()”。2 marxidad:如果您需要在DB以外的其他环境(例如winforms应用程序)中创建级联记录,那么使用Guid而不是(大)int是非常有用的。2 TcKs:但是对于那些Guid为null的旧记录呢?更新一些表格设置一些Guid列=newid()当某个列为空时,我对使用特殊值进行PK有最好的体验。因为这样更改记录中的任何值都没有问题(例如:因为用户输入了错误)。可能是不正确的索引?guid上没有聚集索引吗
        UPDATE foreignTable f
        SET f.guidCol = p.guidCol
        FROM primaryTable p
        WHERE p.intCol = f.intCol