MySQL UUID()不唯一时会发生什么?

3

MySQL生成的UUID()不唯一会发生什么?如果这是一个主键列,MySQL会出错吗,还是会尝试生成另一个UUID()直到找到真正唯一的?

2个回答

5
如果你调用UUID()两次并获得相同的结果,最严重的问题就是"东西坏了"(tm)。它应该是唯一的,据我所知,它应该始终如此。
没有"重新生成"代码可用:该函数被设计为即使跨计算机也可以创建唯一键,那么它怎么可能知道其结果不是唯一的?
来自http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_uuid

UUID被设计为在空间和时间上全局唯一的数字。即使这些调用是在两台未连接到彼此的计算机上执行的,两个对UUID()的调用也应该生成两个不同的值。

也许您的意思是其他的?例如,如果您使用UUID()生成应该是唯一的东西(如主键或唯一字段等),并且先前添加了相同的数字(例如,您调用了UUID()一次,但插入两次),那么当将非唯一内容添加到应该是唯一的位置时,您将只会得到默认错误,而不会得到新的错误。

有关唯一性的一些阅读材料:

  1. 阅读手册,了解如何使用不同的部分生成uuid。参考链接:http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_uuid

  2. 查看该手册中有关实际定义的链接(但这是一篇很长的文章,您可以跳过此步):https://www2.opengroup.org/ogsys/jsp/publications/PublicationDetails.jsp?catalogno=c706

  3. 这里提供了一些易于理解的重复概率指标:http://en.wikipedia.org/wiki/Universally_unique_identifier

  4. MySQL网站(论坛等)上也有一些关于将其用作主键的讨论,但由于我在工作中时间紧迫,您需要自行搜索:)


嗯,但 UUID 是否“几乎唯一且碰撞的可能性较低”而非绝对唯一呢?我想这是我不确定的部分 - UUID() 是否有时不会生成唯一的 ID 呢? - ina
改变是一个棘手的词,但如果这是你所问的,将它们用作主键并不罕见。我会发布一些阅读材料,但你也可以很容易地找到一些。 - Nanne
你会推荐使用UUID作为主键吗? - ina
不是很需要。对于大多数情况,自动递增就足够了。如果您有特殊需求,可以考虑使用它,而且有些人认为它很有效率。如果您有特殊情况,最好解释一下,而不是只考虑您的解决方案(使用uuid),然后再从那里开始 :) - Nanne

4

MySQL UUID()函数是根据MAC地址、版本和时间戳确定性生成的。如果在单个服务器上有2个线程以完全相同的时间戳(精确到微秒)调用该函数,则预计会得到相同的结果。但如果只有一个线程,则由于4Ghz处理器的微秒级差异,这将不可能。


我忘了提到:你会收到一个重复的主键错误。 - dusc2don

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