【问题标题】:MySql Insert Select uuid()MySql 插入选择 uuid()
【发布时间】:2011-06-10 00:44:58
【问题描述】:

假设你有一张桌子:

`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 命令,但我不想这样做。我希望在应该完成的数据库服务器上完成工作。

【问题讨论】:

  • 您确定它为每一行返回完全相同的值吗?当您像这样调用 UUID() 时,我希望每个值中的大多数字符都是相同的,因此在视觉上扫描它们可能看起来相同,但如果仔细观察,每个字符仍然是唯一的。
  • 你确定吗?我尝试了一个类似的测试——我得到了不同的 UUID。

标签: mysql uuid insert-select


【解决方案1】:

原来 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

我假设如果发生碰撞,它会重试。

我的错。

【讨论】:

  • 这是因为 MySQL 使用的 UUID 规范。字符串的很大一部分基于服务器的 MAC 地址,在您的设置中可能不会从一个 INSERT 更改为下一个。字符串的其余部分是基于时间的。 UUID 不是随机的。
  • 此外,发生碰撞的可能性实际上为零(因为这种 UUID 生成模式固有的时间元素),但如果发生碰撞,它不会被拾取,因为你没有在你的字段上使用键。
  • 为我节省了几个小时!谢谢:D
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-02-23
        • 2014-10-17
        • 2021-03-31
        • 1970-01-01
        • 1970-01-01
        • 2012-07-02
        • 2018-02-25
        相关资源
        最近更新 更多