C# 如何在SQL2008中用随机唯一数填充字段

C# 如何在SQL2008中用随机唯一数填充字段,c#,asp.net,sql-server-2008,C#,Asp.net,Sql Server 2008,我有一个表,其中有一个int字段。此字段应填写随机数,且应唯一。最好的解决方案是什么?我是否应该生成一个随机数并检查它是否存在于表中?顺便说一下,我正在使用ASP.NET和C#开发一个web应用程序。使用GUID: public string GetRandomGUID(int length) { // Get the GUID string guidResult = System.Guid.NewGuid().ToString(); // Remove the hyphens

我有一个表,其中有一个int字段。此字段应填写随机数,且应唯一。最好的解决方案是什么?我是否应该生成一个随机数并检查它是否存在于表中?顺便说一下,我正在使用ASP.NET和C#开发一个web应用程序。

使用GUID:

public string GetRandomGUID(int length)
{
  // Get the GUID
  string guidResult = System.Guid.NewGuid().ToString();

  // Remove the hyphens
  guidResult = guidResult.Replace("-", string.Empty);

  // Make sure length is valid
  if (length <= 0 || length > guidResult.Length)
    throw new ArgumentException("Length must be between 1 and " + guidResult.Length);

  // Return the first length bytes
  return guidResult.Substring(0, length);
}
公共字符串GetRandomGUID(整数长度)
{
//获取GUID
字符串guidResult=System.Guid.NewGuid().ToString();
//删除连字符
guidResult=guidResult.Replace(“-”,string.Empty);
//确保长度有效
if(长度guidResult.length)
抛出新ArgumentException(“长度必须介于1和“+guidResult.Length”之间);
//返回第一个长度字节
返回guidResult.Substring(0,长度);
}

你真的需要它是随机的吗?如果您只需要一个唯一的整数值,请使用Identity。检查

编辑: 对于随机数(BigInt),您可以尝试以下方法:

SELECT ABS(CAST(CAST(NEWID() AS VARBINARY(5)) AS Bigint)) as UniqueNo

使用
C#

从数据库

newid()



这两种技术都会给您带来独特的结果。

尝试生成随机数,然后查询数据库以检查该值是否存在。您应该能够通过选择“int field”为“random number”的行并检查@rowcount是否为0来确定它。

此字段的用途是什么?您的表int字段如何获得这些唯一的随机数?您是否仅限于使用int字段,并且如果要将其保留为int,您可以在列上设置标识吗?出于您的目的,您需要将(预期随机数)列设置为标识。请告诉我们为什么需要随机数。这有助于生成随机整数吗?或者您建议更改字段类型?如果您一直需要使用整型字段,并且无法将其设置为数据库中的标识,那么您可以创建一个存储过程,该过程获取列中的最大值并递增。@angusf-我知道GUID是什么,谢谢。我只是指出这个答案并没有解决这个问题。可能是一个完全合理的最终解决方案,这取决于列的实际用途。@MartinSmith,如果它的int字段使其成为SQL SERVER中的Identity列,则是更好的选择,正如augusfGUIDs所建议的那样。Guids的设计是唯一的,而不是随机的。请参阅:。GUID不是随机的:是,但整数的唯一性如何?要求也应该是随机的。@Erno-根据我的知识,GUID将给出一个随机且唯一的值。编辑了我的答案。希望有帮助。这是一个很好的解决方案。有没有办法生成一个更短的数字?用户应在我的应用程序的许多页面中使用此号码。所以他应该提醒这个号码。不管怎样,你的解决方案都非常棒。请注意,如果你需要你的随机数是不可预测的,那么这种方法并不适用(请参阅)。如果可预测性不是问题,为什么要使用随机数,一个简单的标识列就可以了。@DanielRenshaw这是真的,但真正的随机数不能保证是唯一的。我的解给你一个随机的唯一数。“我想不出任何其他的方法来实现这一点。”亚当我的评论实际上是在最初的提问者那里提出的,将来任何人都会看到这一点。但是,转换为
varbinary(5)
会将
uniqueidentifier
从16个字节截断为5个字节,从而产生两个后果:(1)这5个字节的值的唯一性程度将远远低于完整GUID的唯一性程度,而完整GUID首先不能保证100%的唯一性;(2) 5字节的值将比完整的GUID更随机,而完整的GUID即使在完整的形式下也不是随机的。性能如何?您不认为这在大型数据库上可能会很慢吗?@Adam可能会,但在某个阶段(不使用标识),您必须检查列中是否已经存在该值。就个人而言,我将使用GUID或标识。
newid()