MySQL插入独特技术

Eri*_*ari 5 php mysql unique

我有一个将数据插入MySQL的php应用程序,其中包含一个随机生成的唯一值。该字符串将有大约10亿种可能性,任何一次最多可能不超过1或200万个条目。本质上,大多数组合在数据库中将不存在。

我试图找到最便宜的方法来确保插入的唯一价值。具体来说,我的两个选择是:

  1. 具有生成此唯一ID的功能。在每一代中,测试数据库中是否存在该值,如果是,则重新生成,如果否,则返回值。
  2. 生成随机字符串并尝试插入。如果插入失败,则测试错误为1062(MySQL 对密钥Y重复输入X),重新生成密钥并以新值插入。

依靠MySQL错误重新尝试插入是一个坏主意吗?如我所见,该值可能是唯一的,并且似乎初始值(使用技术1)是不必要的。

编辑#1

我还应该提到,该值必须是6个字符长的字符串,由大写字母和/或数字组成。它们也不能增量-它们应该是随机的。

编辑#2

附带说明,我正在尝试为难以猜测的礼品券创建兑换代码。使用数字和字母可为每个字符创建36种可能性,而不是仅10种数字或26种字母的可能性。

这是我创建的解决方案的简化版本。在表中输入的第一个值是主键,它会自动递增。如果插入成功,受影响的行()将等于1:

 $code = $build_code();
 while ((INSERT INTO certificates VALUES ('', $code) ON DUPLICATE KEY UPDATE pk = pk) && affected_rows() == 0)
      $code = $build_code();
Run Code Online (Sandbox Code Playgroud)

Cer*_*rad 2

依赖 MySQL 错误来重试插入是不是一个坏主意?

没有。如果您愿意,请继续使用它。事实上,很多人认为如果你检查一下,如果它不存在,那么插入就是安全的。但是除非你锁定表,否则另一个进程总是有可能溜进去并获取 ID。

因此,如果适合您的目的,请继续生成随机 ID。只需确保测试您的代码,以便它能够正确处理重复。记录重复也可能很有用,只是为了确保您对重复发生的可能性有多大的假设是正确的。