2

我正在将学生 ID 作为随机数输入数据库

  int num = r.Next(1000);
  Session["number"] = "SN" + (" ") + num.ToString();

但是有没有机会得到重复的号码?我怎样才能避免这种情况?

编辑 :: 我有一个身份列,学生 ID 与 ID 是分开的,我将从 UI 将随机学生 ID 输入数据库。

4

9 回答 9

7

在数据库中拥有一个仅是整数唯一 ID 的列是一项非常常见的任务。以至于我曾经使用过的每个数据库都有一个特定的列类型、函数等来处理它。它会根据您使用的任何特定数据库而有所不同,但您应该弄清楚它是什么并使用它。

  • 您需要一个唯一的值,而不是random。两者是不同的。随机数重复,它们不是唯一的。唯一的数字也不是随机的。例如,如果您只是从 0 开始递增数字,它将是唯一的,但这绝不是随机的。
  • 您可以使用唯一的 GUID,但它是 128 位。这是相当大的。大多数数据库只会有一个计数器,每次添加项目时它们都会递增,因此 32 位通常就足够了。这将为您节省大量空间。增加计数器也比计算 GUID 的新值更快。对于往往涉及添加大量项目的数据库操作,这可能很重要。
  • 正如 Jodrell 在评论中提到的,如果您使用 GUID 或其他大字段,还应该考虑索引的大小。对于需要更多位的列,存储和维护该索引将更加昂贵(在时间和空间上)。
  • 如果您尝试自己做某事,那么您很有可能会做错。要么你的算法不是完全唯一的,它会由于不正确的同步而产生竞争条件,它会因为过度同步而降低性能,它会显着更大,因为这是降低冲突风险的方法,等等。在最终,数据库将可以访问您无法访问的工具;让它照顾它,这样你就不必担心你会搞砸什么。
于 2012-10-05T16:06:23.417 回答
3

当然,您很有可能会得到一个重复的号码。Next 只是给你一个 0 到 1000 之间的数字,但不能保证这个数字不会是 Next 过去返回的某个数字。

如果您尝试使用唯一值,请考虑使用 Guids 而不是整数,或者使用不断增加的整数值而不是任何随机数。这里是关于 Guid http://msdn.microsoft.com/en-us/library/system.guid.aspx的参考页面

于 2012-10-05T16:08:27.223 回答
3

您可以使用 Guid 而不是随机 int ,它们将始终是唯一的

没有办法保证一个 int 是唯一的,除非你检查已经存在的每一个,即使那样 - 就像评论说的那样,当你传递 1000 个 id 时,你保证重复

编辑:

我提到我认为 Guid 在这里是最好的,因为这个问题,首先索引表不会花费很长时间 - 由于 int 的大小,假设会有少于 1000 名学生,128 位是在少于 1000 行的表中很好。

Guid 是学习的好东西——尽管它们并不总是最有效的方法

在 c# 中创建一个唯一的 Guid 有一个好处,您可以继续使用并在问题中显示该 ID,而无需再次访问 Db 来确定分配给学生的唯一 ID

于 2012-10-05T16:05:03.537 回答
2

是的,你会得到重复的。如果您想要一个真正独特的项目,您将需要使用 Guid。如果您仍然想使用数字,那么您将需要跟踪您已经使用过的数字,类似于数据库中的标识列。

于 2012-10-05T16:05:25.540 回答
2

是的,你肯定会得到重复的。您可以使用 aGUID代替:

Guid g = Guid.NewGuid();

GUID 在理论上是“全球唯一的”。

于 2012-10-05T16:06:40.483 回答
2

您可以尝试使用以下方法生成 id Guid

Session["number"] = "SN" + (" ") + Guid.NewGuid().ToString();

它将大大减少获得重复 ID 的机会。

于 2012-10-05T16:07:25.180 回答
1

如果您使用的是随机数,那么没有没有办法避免它。总会有发生碰撞的可能。

我认为您可能正在寻找的是一个身份列,或者您的数据库服务器的任何等价物。

于 2012-10-05T16:07:08.637 回答
1

在 LINQ to SQL 中,可以像这样设置行:

    [Column ( IsPrimaryKey = true, IsDbGenerated = true )] 
    public int ID { get; set; }

我不知道它是否对你有帮助,但也许这是一个很好的提示......

于 2012-10-05T16:14:21.160 回答
-1

是的,当然有机会。

快速解决方法:
先检查是否是重复号码,然后重试,直到不再是重复号码。

于 2012-10-05T16:04:24.167 回答