【发布时间】:2013-04-18 05:35:09
【问题描述】:
我有一个主键类型为 Guid 的表。在我的 MVC 应用程序中,我想向该表添加一条记录。我知道创建新 Guid 的 Guid.newGuid()。这很好用,但我有一个担心。如何确保创建的 Guid 是唯一的(数据库中尚不存在)?有没有办法通过比较现有值来生成它,以确保新 guid 在数据库记录中是唯一的?
【问题讨论】:
标签: c# asp.net-mvc database primary-key guid
我有一个主键类型为 Guid 的表。在我的 MVC 应用程序中,我想向该表添加一条记录。我知道创建新 Guid 的 Guid.newGuid()。这很好用,但我有一个担心。如何确保创建的 Guid 是唯一的(数据库中尚不存在)?有没有办法通过比较现有值来生成它,以确保新 guid 在数据库记录中是唯一的?
【问题讨论】:
标签: c# asp.net-mvc database primary-key guid
产生重复的可能性非常低。但是,您可以对数据库表强制执行 UNIQUE 约束。
【讨论】:
guid 生成技术的全部目的是它不需要。该算法将生成一个全局唯一值,即使它无法访问所有其他先前生成的 GUID。
特别是,该算法只生成一个大随机数。 GUID 中有太多的数据位,以至于其中两个具有相同值的几率非常小。小到可以真正忽略它们。
如需更详细的分析,请参阅Eric Lippert's blog on the subject。 (特别是part three。)
请注意,因此,使用 GUID 作为唯一标识符将在数据库中占用比仅使用数字标识符更多的空间。任何体面的数据库都会有一个特殊的列类型,专门设计为它将填充的唯一标识符;这样的列将能够确保唯一性,同时使用比 GUID 少得多的空间。
【讨论】:
但是,新 GUId 与数据库中存在的任何人匹配的可能性很小。
但是,如果您仍然想确保只创建一个 proc 或其他可以为 GUID 提供真或假的东西。如果返回 true,则再次生成并重复此过程,直到无法获得唯一的 GUID。
【讨论】: