【问题标题】:C# generate Guid that is unique(does not exist in a table in the database)C#生成唯一的Guid(数据库中的表中不存在)
【发布时间】:2013-04-18 05:35:09
【问题描述】:

我有一个主键类型为 Guid 的表。在我的 MVC 应用程序中,我想向该表添加一条记录。我知道创建新 Guid 的 Guid.newGuid()。这很好用,但我有一个担心。如何确保创建的 Guid 是唯一的(数据库中尚不存在)?有没有办法通过比较现有值来生成它,以确保新 guid 在数据库记录中是唯一的?

【问题讨论】:

标签: c# asp.net-mvc database primary-key guid


【解决方案1】:

产生重复的可能性非常低。但是,您可以对数据库表强制执行 UNIQUE 约束。

【讨论】:

  • 这应该被否决,而不是被赞成。为不存在的问题提出解决方法是浪费我们的时间。
  • @BentTranberg - 不,不应该。如果您没有什么建设性要说的,那么当您自己没有提供更合适的答案时,请不要评论我和其他人的答案。
【解决方案2】:

guid 生成技术的全部目的是它不需要。该算法将生成一个全局唯一值,即使它无法访问所有其他先前生成的 GUID。

特别是,该算法只生成一个大随机数。 GUID 中有太多的数据位,以至于其中两个具有相同值的几率非常小。小到可以真正忽略它们。

如需更详细的分析,请参阅Eric Lippert's blog on the subject。 (特别是part three。)

请注意,因此,使用 GUID 作为唯一标识符将在数据库中占用比仅使用数字标识符更多的空间。任何体面的数据库都会有一个特殊的列类型,专门设计为它将填充的唯一标识符;这样的列将能够确保唯一性,同时使用比 GUID 少得多的空间。

【讨论】:

  • 关于空间问题的要点。请注意,如果用作主键,当在该表上使用索引时,它是一个大数据类型的事实将被放大,因为它存储了每条记录的主键。
  • @ScottAdams - 采摘时间。至少在 SQL Server 中,不是这样。真实的是 聚集索引 键存储在每个(非聚集)索引中。但是聚簇索引和主键是正交的概念。
  • @Damien_The_Unbeliever,很好的观点和重要的区别,当它们不同时。因此,要更改,“请注意,如果用作您的聚集索引键,那么当在该表上使用非聚集索引时,它是一个大数据类型的事实将被放大,因为它将存储为每个非聚集索引的查找记录。
【解决方案3】:

但是,新 GUId 与数据库中存在的任何人匹配的可能性很小。

但是,如果您仍然想确保只创建一个 proc 或其他可以为 GUID 提供真或假的东西。如果返回 true,则再次生成并重复此过程,直到无法获得唯一的 GUID。

【讨论】:

  • OP 正在数据库外创建 quid
  • 它的 GUID 而不是 quid。我知道他在 DB 之外生成。
  • 因此,您将在客户端代码中创建一个 quid/GUID。然后你会在保存到数据库中,调用一个循环,直到找到一个唯一的过程。不在乎它已经是独一无二的了。然后完成保存?如果 OP 想要制造这种混乱,他们为什么不只依赖数据库并使用 NEWID() 的默认值?
  • 这应该被否决,而不是被赞成。为不存在的问题提出解决方法是浪费我们的时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多