如何为表的主键创建唯一的随机整数ID?

Min*_*ame 10 mysql sql primary-key uniqueidentifier

我想知道是否有人知道为表的主键创建唯一的随机整数id的好方法.我正在使用MySQL.该值必须是整数.

Gar*_*een 14

回应: "因为我想使用该值来编码到Base62,然后将其用于url中的id.如果我自动递增,则用户可能会明白如何生成url id."

如果安全是您的目标,那么使用Base62,即使使用"随机"生成的数字也无济于事.

更好的选择是:

  • 不要重新发明轮子 - 使用 AUTO_INCREMENT
  • 然后使用加密哈希函数+随机生成的字符串(隐藏在该特定URL的数据库中)以生成该URL的最终"唯一ID"

  • 感谢您的回应。好的,我使用自动增量,然后使用加密哈希函数+随机生成的字符串。但是我需要我的网址要简短。像tinyurl一样简短。通过使用加密技术,我不会得到一个很长的“该URL的唯一ID”吗? (2认同)

byt*_*ave 10

如果您愿意接受建议并且可以实施,请使用UUID.MySQL的UUID()函数将返回一个可用于的36个字符值ID.

如果你想使用整数,我认为你需要创建一个getRandID()你将在INSERT语句中使用的函数.此函数需要使用现有ID的随机+检查来返回之前未使用的ID.

检查RAND()MySQL的功能.

  • @Tesh我会在由于UNIQUE约束而引起异常时在CATCH中重复该功能,并继续操作,直到您能够插入具有该随机ID的行为止。 (2认同)

小智 7

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

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

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

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

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

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