MySql Insert选择uuid()

时间:2011-06-10 00:44:59

标签: mysql uuid insert-select

假设你有一张桌子:

`item`

使用字段:

`id` VARCHAR( 36 ) NOT NULL
,`order` BIGINT UNSIGNED NOT NULL

Unique(`id`)

你打电话:

INSERT INTO `item` (
`item`.`id`,`item`.`order`
) SELECT uuid(), `item`.`order`+1

MySql会将相同的uuid插入到所有新创建的行中。

所以如果你从:

开始
aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa, 0
bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb, 1

你最终会得到:

aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa, 0
bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb, 1
cccccccc-cccc-cccc-cccc-cccccccccccc, 1
cccccccc-cccc-cccc-cccc-cccccccccccc, 2

如何命令MySql为每一行创建不同的uuid?

我知道以下在MSSQL中按预期工作:

INSERT INTO item (
id,[order]
) SELECT newid(), [order]+1

n.b。我知道我可以选择结果,遍历它们并为我的PHP代码中的每一行发出一个单独的INSERT命令,但我不想这样做。我希望在数据库服务器上完成工作。

5 个答案:

答案 0 :(得分:17)

结果是uuid() 每行生成一个不同的uuid。

但是我没有像往常期望的那样随机生成所有块,而是MySql似乎只是随机生成第二块。大概是为了更有效率。

因此,当实际上MySql改变了第二个块时,uuids看起来相同。 e.g。

cccccccc-cccc-cccc-cccc-cccccccccccc
ccccdddd-cccc-cccc-cccc-cccccccccccc
cccceeee-cccc-cccc-cccc-cccccccccccc
ccccffff-cccc-cccc-cccc-cccccccccccc

我假设如果发生碰撞,它会再次尝试。

我的坏。

答案 1 :(得分:3)

请尝试使用MID(UUID(),1,36)代替uuid()。

答案 2 :(得分:2)

  

如何命令MySql创建另一个uuid foreach行?

MySQL不允许将表达式作为默认值。您可以通过允许该字段为空来解决此问题。然后是add insert/update triggers,当为null时,将字段设置为uuid()。

答案 3 :(得分:1)

MySQL的UUID()函数生成V1 UUID,这些UUID分为时间,序列和节点字段。如果在单个节点上调用它,则时间字段中只有几个位会有所不同;这称为时间唯一性。如果您在完全相同的时间在不同的节点上调用它,则节点字段将有所不同。这称为空间唯一性。将两者结合在一起非常有力,并且可以保证通用唯一性,但同时也会泄漏有关创建每个V1 UUID的时间和地点的信息,这可能是安全问题。糟糕!

V4 UUID现在通常比较流行,因为它们将数据(和更多)散列在一起,因此不会泄漏任何东西,但是您需要一个不同的函数来获取它们-当心它们将对性能产生什么影响如果您的插入量很大; MySQL(至少到目前为止)并不擅长索引(伪)随机值,这就是为什么V1是它们为您提供的原因。

答案 4 :(得分:-3)

首先使用the php uniqid() function 生成唯一字符串 并插入ID字段。