如何在 laravel 中为每个用户生成唯一的自动增量值并将其添加到数据库中

Posted

技术标签:

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

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

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

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

【问题讨论】:

查看这个答案***.com/a/44365524/8274885 你能生成time-based uuid吗?它们必须是 10 位整数吗? 检查这个~-> ideone.com/UeOfus 【参考方案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

您无需担心自动递增。

【讨论】:

以上是关于如何在 laravel 中为每个用户生成唯一的自动增量值并将其添加到数据库中的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 4.2 中为特定类别任务自动生成序列号?

如何在laravel 5.2中为每个文件添加用户ID以供下载?

如何在 laravel 中进行会话?

如何在 laravel 查询生成器中为 sql 选择列添加别名?

在 C# 中为不同的客户生成自动发票编号

如何在 GraphQL 突变/解析器中为每个用户创建和停止唯一的计时器