我有一个Postgres 9.3表,其中有一个名为id
的列为PKEY,id
为char(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,例如1234567
,1234567
尚未使用PKEY,因此,插入时,一个进程将失败。
我认为这是一个非常古老的问题,什么是完美的解决方案?
修改
我认为已经回答了这个问题,请参阅Jon Clements的评论。
答案 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