【问题标题】:How to generate unique auto increment value for each user in laravel and add it to database如何在 laravel 中为每个用户生成唯一的自动增量值并将其添加到数据库中
【发布时间】:2020-02-06 09:23:25
【问题描述】:

我正在开发一个活动组织网站。在这里,当用户注册一个事件时,他将获得一个唯一的随机数(10 位),我们用它来生成条形码并将其邮寄给他。现在,

  1. 我想让每个注册事件的编号都是唯一的。
  2. 还有自动增量 一种解决方案是获取数组中的所有自动增量数字,并使用 laravel 生成一个自动增量数字,格式为(0000000001 到 9999999999),然后循环并检查所有值。获取不等于数组中任何值的第一个值并将其添加到数据库中。

但我认为可能有更好的解决方案。有什么建议吗?

【问题讨论】:

标签: php mysql laravel


【解决方案1】:

选择存储在数据库中的最大数量并在其中添加 1,例如:

SELECT (MAX(Column_Name)+1) AS Max_val FROM Table_Name;

【讨论】:

  • 这是唯一可以自动递增的现实解决方案。这不是随机的,但 OP 真的需要它吗?
【解决方案2】:

我建议使用基于时间戳的简单解决方案,使用Carbon 类来使用时间戳生成唯一编号。使用timestamp 生成基本的唯一且随机的戳记相当简单。 您可以使用如下所示,

use Carbon\Carbon;
$current_timestamp = Carbon::now()->timestamp; // Produces something like this 1552296328

您可以将其用作唯一标识符。如果您想要下一个数字,只需 +1。但请记住,您必须及时管理另一个号码批次。 (即如果您现在按增量生成了 500 个数字,则您不应在接下来的 500 秒内生成另一个数字。否则,它将重复该数字)。想了解更多,可以阅读here

rand() 函数的解决方案在这里可能不起作用,因为它可以重新生成数据库中现有的数字,并且您将因 Unique Constraint Violation而出错(即,如果您在 DB 中有唯一的列)。

【讨论】:

    【解决方案3】:

    无论您使用什么方法,它都永远不会是真正随机的。它将是PRNG。对于您的情况,我认为零填充的自动增量应该足够了。

    但是如果你设置使用随机数,那么使用 PHP 的rand() 函数就足够了。 10 位表示 10000000000 个唯一数字。除非您的项目有数百万个事件,否则实际上应该没问题。所以,方法1应该没问题。此外,您可以在生成任何随机数后检查该数字是否已经存在(有 0.000001% 或类似的机会。)。如果存在,则尝试再次生成随机数。

    但是,如果您的项目非常成功(即数百万个事件),那么类似于Y2K 的问题可能会蔓延。

    【讨论】:

      【解决方案4】:

      MySQL UUID 会给你真正独一无二的是:Store UUID v4 in MySQL

      您无需担心自动递增。

      【讨论】:

        猜你喜欢
        • 2015-04-15
        • 2011-09-06
        • 2021-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-20
        • 2018-10-01
        相关资源
        最近更新 更多