如何生成随机ID?

时间:2014-12-14 10:51:34

标签: python postgresql random

我有一个Postgres 9.3表,其中有一个名为id的列为PKEY,idchar(9),并且只允许使用小写a-z0-9,我使用带psycopg的Python插入此表。

当我需要插入此表时,我调用Python函数get_new_id(),我的问题是,如何使get_new_id()有效?

我有以下解决方案,他们都不满足我。

a)预先生成很多id s,将它们存储在某个表中,当我需要一个新的id时,我从这个表中SELECT一个,然后从这个表中删除它,然后返回此选定的ID。此解决方案的缺点是需要维护此表,在每次get_new_id()调用中,还会有一个SELECT COUNT,以便了解是否需要生成更多ID以放入此表

b)当get_new_id()被调用时,它会生成一个随机id,然后将此id传递给存储过程以检查此id是否已被使用,如果不是,我们是好的,如果是,则执行b )再次。该解决方案的缺点是,当表格变大时,失败率可能会很高,并且两个进程中的两个get_new_id()调用可能会生成相同的ID,例如12345671234567尚未使用PKEY,因此,插入时,一个进程将失败。

我认为这是一个非常古老的问题,什么是完美的解决方案?

修改

我认为已经回答了这个问题,请参阅Jon Clements的评论。

2 个答案:

答案 0 :(得分:1)

Offtopic,因为您已经有char(9)数据类型:

当需要随机字符串时,我会使用UUID,它是标准语言,几乎所有编程语言(包括Python)都可以为您生成UUID。

PostgreSQL也可以使用uuid-ossp扩展名为您完成。

答案 1 :(得分:0)

select left(md5(random()::text || now()), 9);
   left    
-----------
 c4c384561

将id设为主键并尝试插入。如果抛出异常,请抓住它并重试。没什么好看的。为什么只有9个字符?让它完整32。

请查看此答案,了解如何缩小答案:https://stackoverflow.com/a/15982876/131874