MySQL UUID()何时不唯一?

时间:2012-03-13 07:24:52

标签: mysql uuid uniqueidentifier unique-key

当MySQL生成的UUID()不唯一时会发生什么?如果这是一个作为主键的列,MySQL是否会出错,或者是否尝试生成另一个UUID,直到找到真正唯一的UUID?

2 个答案:

答案 0 :(得分:5)

好吧,如果你两次打电话给UUID()并得到相同的结果,最有问题的就是“东西坏了”(tm)。它应该是独一无二的,据我所知它应该永远。

没有“再生”代码可用:该功能旨在创建甚至跨计算机的唯一键,所以它怎么能知道它的结果不是唯一的呢?

来自http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_uuid

  

UUID被设计为在空间和全球范围内唯一的数字   时间。对UUID()的两次调用预计会产生两种不同的调用   值,即使这些调用是在两台独立的计算机上执行的   彼此没有联系。

也许你的意思是别的?例如,如果您使用UUID()生成应该是唯一的内容(如主键或唯一字段等),并且您之前添加了相同的数字(例如您调用UUID()一次,但插入两次),然后你只会得到在将非唯一内容添加到应该是唯一的地方时得到的默认错误。你不会得到一个新的。

  

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

  1. 手册。阅读它,以及它如何使用各种部分生成uuidhttp://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网站(论坛等)上也有一些关于将它用作主键的讨论,但由于我在工作并且时间紧迫,你需要自己搜索:)

答案 1 :(得分:3)

MySQL UUID()确定性地基于MAC地址,版本和时间戳。如果单个服务器上的2个线程使用相同的时间戳(完全相同的微秒)进行调用,则预期会产生相同的结果。单线程无法实现这一点,因为4Ghz处理器上的调用将间隔几微秒。