PostgreSQL是否保证对于带有唯一约束和随机UUID默认值的列生成唯一的UUID?

3

给定这样一张表:

CREATE TABLE the_table (
  the_uuid UUID NOT NULL UNIQUE DEFAULT gen_random_uuid()
  -- more columns
);

如果我们插入一行没有为the_uuid列指定值,而DBMS生成了一个随机UUID,那么Postgres是否无缝处理生成已存在于该列中的UUID的不太可能的情况?

人们会想象Postgres可以重试随机UUID生成,直到获得不违反约束的UUID。但是,如果Postgres没有以这种方式实现,那么就需要在外部处理。

对于数字类型,我们有一个解决这个问题的SEQUENCE的概念,但我不知道UUID类型的类比物。

许多读者可能会想要评论或回答我担心发生的事情几乎不可能发生,我同意,但我仍然有兴趣更好地了解Postgres可能处理此问题的方式。


2
如果gen_random_uuid()生成的值已经存在于数据库中,将会抛出“重复键”违规错误。顺序(sequence)并不能解决这个问题。 - user330315
1
由于生成冲突的可能性非常低,所以不需要编写特定的代码来处理冲突。花费时间去设计解决方案是浪费时间。记住 - 每秒要生成10亿个类型4 UUID,连续85年才有超过50%的概率生成两个相同的UUID。 - undefined
@a_horse_with_no_name 你是什么意思说“序列不能解决这个问题”?它确实可以解决问题。 - undefined
@Damien_The_Unbeliever 我完全理解你的观点。我想,如果PostgreSQL的开发人员没有针对这种情况实施防御措施,我可能不需要担心它。 - undefined
1
@rosmak:你可以绕过序列生成直接插入到表中。但下次从序列中取值时,你将会遇到完全相同的问题。最终,你还是不得不处理“重复键”错误,无论采取哪种方式。 - user330315
这是一个很好的问题。通常,“几乎不可能发生”意味着追踪那些发生得很少但必须在客户端代码中处理的主键冲突。 - undefined
1个回答

0
根据DBA stack exchange上的回答, 没有任何保证。
我不想抄袭答案并在这里复制,但是发帖人似乎提供了一个令人信服的例子来证明这种行为。我自己没有尝试过。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接