MySql 插入选择 uuid()
假设您有一个表:
`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 命令,但我不想这样做。我希望工作在应该完成的数据库服务器上完成。
Say you have a table:
`item`
With fields:
`id` VARCHAR( 36 ) NOT NULL
,`order` BIGINT UNSIGNED NOT NULL
And:
Unique(`id`)
And you call:
INSERT INTO `item` (
`item`.`id`,`item`.`order`
) SELECT uuid(), `item`.`order`+1
MySql will insert the same uuid into all of the newly created rows.
So if you start with:
aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa, 0
bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb, 1
You'll end up with:
aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa, 0
bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb, 1
cccccccc-cccc-cccc-cccc-cccccccccccc, 1
cccccccc-cccc-cccc-cccc-cccccccccccc, 2
How do I command MySql to create a different uuid for each row?
I know that the following works as expected in MSSQL:
INSERT INTO item (
id,[order]
) SELECT newid(), [order]+1
n.b. I know I could SELECT the results, loop through them and issue a separate INSERT command for each row from my PHP code but I don't want to do that. I want the work to be done on the database server where it's supposed to be done.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

发布评论
评论(5)
如何命令 MySql 为每行创建不同的 uuid?
MySQL 不允许将表达式作为默认值。您可以通过允许该字段为空来解决此问题。然后添加插入/更新触发器,当为空时,将该字段设置为 uuid()。
MySQL 的 UUID() 函数生成 V1 UUID,分为时间、序列和节点字段。如果在单个节点上调用,则只有时间字段中的几个位会不同;这被称为时间唯一性。如果同时在不同节点上调用,节点字段会不同;这被称为空间独特性。两者的结合非常强大,可以保证通用唯一性,但它也会泄露有关每个 V1 UUID 创建时间和地点的信息,这可能是一个安全问题。哎呀。
V4 UUID 现在通常更流行,因为它们将数据(以及更多数据)散列在一起,因此不会泄漏任何内容,但您需要不同的函数来获取它们 - 如果您有,请注意它们会对性能产生什么影响高插入量; MySQL(至少目前)不太擅长索引(伪)随机值,这就是为什么他们为您提供 V1。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
结果 uuid() 每行生成一个不同的 uuid。
但是,MySql 似乎只随机生成第二个块,而不是像我通常期望的那样随机生成所有块。估计是为了效率更高。
因此乍一看,uuid 看起来是相同的,而实际上 MySql 已经更改了第二个块。例如,
我假设如果发生碰撞,它会重试。
我的不好。
Turns out uuid() is generating a different uuid per row.
But instead of generating all the chunks randomly, as I would normally expect, MySql appears to only be generating the 2nd chunk randomly. Presumably to be more efficient.
So at a glance the uuids appear identical when in fact MySql has altered the 2nd chunk. e.g.
I assume if there is a collision it would try again.
My bad.