12

假设你有一张桌子:

`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

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

4

5 回答 5

25

结果 uuid()每生成不同的 uuid。

但是不像我通常期望的那样随机生成所有块,MySql 似乎只随机生成第二个块。估计效率更高。

因此,乍一看,uuid 看起来是相同的,而实际上 MySql 已经更改了第二个块。例如

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

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

我的错。

于 2011-06-10T12:01:21.057 回答
3

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

MySQL 不允许将表达式作为默认值。您可以通过允许该字段为空来解决此问题。然后添加插入/更新触发器,当它为空时,将字段设置为 uuid()。

于 2011-06-10T09:11:52.823 回答
3

请尝试使用MID(UUID(),1,36)而不是 uuid()。

于 2017-01-05T05:07:42.647 回答
2

MySQL 的 UUID() 函数生成 V1 UUID,分为时间、序列和节点字段。如果在单个节点上调用它,只有时间字段中的几个位会不同;这被称为时间唯一性。如果你同时在不同的节点上调用它,节点字段会有所不同;这被称为空间唯一性。将两者结合起来非常强大,可以保证通用唯一性,但它也会泄露有关每个 V1 UUID 的创建时间和地点的信息,这可能是一个安全问题。哎呀。

V4 UUID 现在通常更受欢迎,因为它们将这些数据(以及更多)散列在一起,因此不会泄漏任何东西,但你需要一个不同的函数来获取它们——如果你有,请注意它们会对性能造成什么影响高插入量;MySQL(至少现在)不是很擅长索引(伪)随机值,这就是为什么 V1 是他们给你的。

于 2018-07-31T23:24:27.857 回答
-3

首先使用php uniqid() 函数生成一个 uniq 字符串 并插入到 ID 字段中。

于 2013-03-11T10:54:35.060 回答