如何在MySQL中生成唯一ID?

ass*_*qaf 30 php mysql sql

我正在使用PHP和MySQL编写脚本,我希望得到一个唯一的id(由字符串组成:大写字母和带数字的小写字母),如:gHYtUUi5b.我发现PHP中的许多函数可以生成这样的数字,但我担心如何确保id是唯一的!

更新:uuid很长,我的意思是这样的id:(P5Dc)一个11个字母数字字符.

CSh*_*Atl 55

我使用UUID()来创建一个唯一的值.

例:

insert into Companies (CompanyID, CompanyName) Values(UUID(), "TestUUID");
Run Code Online (Sandbox Code Playgroud)

  • @assaqqaf,你可以使用UUID_SHORT()代替. (10认同)
  • 您能否详细说明为什么通过 mysql 生成 UUID 可能会“破坏数据库”? (6认同)
  • `UUID()` 的生成是否检查生成的 uuid 是否已存在于表中?换句话说,uuid 在目标表中总是唯一的吗? (3认同)
  • thanx 但 uuid 很长,我的意思是这样的 id:(P5Dc) 一个 11 个字母数字字符。 (2认同)

RJS*_*ord 21

你可能喜欢我们这样做的方式.我想要一个看似"随机"的可逆唯一代码 - 一个相当常见的问题.

  • 我们输入一个输入数字,如1,942.
  • 将其填入字符串:"0000001942"
  • 将最后两位数字放在前面:"4200000019"
  • 将其转换为数字:4,200,000,019

我们现在有一个号码在通话之间变化很大,保证不到10,000,000,000.这不是一个坏的开始.

  • 将该数字转换为Base 34字符串:"2oevc0b"
  • 用'y'替换任何零,用'z'替换任何零:"2oevcyb"
  • 升档:"2OEVCYB"

选择基数34的原因是我们不担心0/O和1/1碰撞.现在,您有一个短随机密钥,可用于查找LONG数据库标识符.


drA*_*erT 14

一种编程方式可以是:

  • 在该字段中添加UNIQUE INDEX
  • 在PHP中生成一个随机字符串
  • PHP循环(while(!DO_THE_INSERT))
    • 生成另一个字符串

注意:

  • 这可能很脏,但具有与DBMS无关的优点
  • 即使您选择使用DBMS特定的唯一ID生成器函数(UUID等),最佳做法使用索引确保字段HAS为UNIQUE
  • 循环在统计上根本不执行,仅在插入失败时输入

  • 而不是循环失败的插入(这可能是由于其他原因导致无限循环),我会在找到相同的ID时循环ID生成,然后在插入失败时插入并抛出异常.您只有一个循环具有相同的统计信息,它更安全,并在插入失败时提供信息(出于其他原因). (8认同)
  • 除非您的随机数生成器不是完全随机的.书面竞赛条件通常是坏主意^ TM (2认同)

zah*_*zah 8

如果使用5.7.4以上版本的MySQL,可以使用新增的RANDOM_BYTES函数:

 SELECT TO_BASE64(RANDOM_BYTES(16));
Run Code Online (Sandbox Code Playgroud)

这将产生一个随机字符串,例如GgwEvafNLWQ3+ockEST00A==.


小智 6

如何生成unique_ids是一个有用的问题 - 但是你似乎生成它们会做出反效果的假设!

我的观点是,您在创建行时不需要生成这些唯一ID,因为它们基本上与所插入的数据无关.

我所做的是预先生成独特的id以供将来使用,这样我就可以享受自己的甜蜜时光并绝对保证它们是独一无二的,并且在插入时无需进行任何处理.

例如,我有一个order_id的订单表.当用户输入订单时,会立即生成此ID,永久递增1,2,3等.用户无需查看此内部标识.

然后我有另一个表 - unique_ids与(order_id,unique_id).我有一个每天晚上运行的例程,它会为此表预加载足够多的unique_id行,以覆盖可能在接下来的24小时内插入的订单.(如果我在一天内获得10000个订单,我就会遇到问题 - 但这将是一个很好的问题!)

这种方法保证了唯一性,并且可以将任何处理负载从插入事务转移到批处理例程中,而不会影响用户.