MySQL UUID主键 - 由PHP生成还是由MySQL生成?

11

我原本认为只要使用MySQL通过UUID()生成主键,就可以确保该键在不同服务器上是唯一的。

但是,无法获得最后插入的UUID,这要求每次插入时都需要执行额外的select语句。

是否有可能让PHP生成与MySQL生成完全相同的UUID()

3个回答

15

不,PHP无法生成与MySQL相同的UUID(),因为它是(完全)随机数。

看起来您的问题是希望在MySQL中使用UUID(),但不想执行额外的查询来找出新的UUID

那么为什么不让PHP创建用作INSERT查询中主键的UUID呢? php.net上的这个评论应该向您展示如何实现此操作。

使用这些示例函数:

$uuid = UUID::v4();
$sql = "INSERT INTO mytable (uuid, foo) VALUES ('{$uuid}', 'bar');";
echo "The UUID is: ". $uuid;

编辑:在该页面上有几种生成不同类型的UUID的方法。 v4是伪随机的,但您可以使用不同的版本或创建自己的UUID生成器。


嗯,使用这种方法,我需要检查它在MySQL中是否是唯一的uuid,并且它是否在服务器之间唯一。似乎每个方向都需要额外的唯一性检查或数据拉取? - ina
4
如果您使用随机生成的UUID,就不会有这个问题。统计学上讲,如果您每秒生成10亿个UUID并持续100年,仅有50%的几率发生一个碰撞。(来源:http://en.wikipedia.org/wiki/Universally_unique_identifier#Random_UUID_probability_of_duplicates)尽管您可能永远不会遇到碰撞,但将UUID设为MySQL的主键并定期同步服务器仍然是明智的选择。 - Colin O'Dell

0
根据您的具体情况,我可能会使用存储过程。 这样,您可以:
  • 生成一个 mySQL UUID()
  • 将其存储在变量中,
  • 执行 INSERT 语句
  • SELECT 变量

-1
我尝试了第一步:$uuid = UUID::v4();,但它挂起了我的服务器,所以我想到了另一个想法,我按照以下方式尝试:
从查询中获取数据$sql1 = SELECT UUID() AS uuid ;
然后存储在变量$uuid
然后使用以下内容
$sql = "INSERT INTO mytable (uuid, foo) VALUES ('{$uuid}', 'bar');";
echo "The UUID is: ". $uuid;

使用SQL生成UUID而不是PHP,并没有任何好处,反而会更慢,因为它需要多次查询数据库服务器(即使服务器在同一台机器上)。 - HappyDog

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