【问题标题】:Generate GUID in MySQL for existing Data?在 MySQL 中为现有数据生成 GUID?
【发布时间】:2011-09-10 23:13:52
【问题描述】:

我刚刚将一堆数据导入到 MySQL 表中,并且我有一个“GUID”列,我想基本上用新的和唯一的随机 GUID 填充所有现有行。

我如何在 MySQL 中做到这一点?

我试过了

UPDATE db.tablename
  SET columnID = UUID()
  where columnID is not null

让每个字段都一样

【问题讨论】:

  • 你确定是一样的吗
  • 是的,我确认,是一样的!
  • 它对我有用 - 差异很小,但确实存在。最快的检查方法是在列中添加一个 UNIQUE 约束。
  • 很抱歉在这里删除了一个旧帖子,但SET columnID = UUID() 有效 - 只是如果您在大量行上执行此操作,大多数 UUID 字符将显示相同但会有是细微的差别。 +1 对 PSU 的回答

标签: mysql random guid


【解决方案1】:

在使用 mysql 作为 sql_mode = "" 时出现此错误。经过一些测试,我确定问题是由这种用法引起的。当我在默认设置上测试时,我发现这个问题不存在。 注意:更改模式后不要忘记刷新连接。

【讨论】:

    【解决方案2】:

    MYsql

    UPDATE tablename   SET columnName = UUID()
    

    神谕

    UPDATE tablename   SET columnName = SYS_GUID();
    

    SQLSERVER

    UPDATE tablename   SET columnName = NEWID();;
    

    【讨论】:

      【解决方案3】:
      // UID Format: 30B9BE365FF011EA8F4C125FC56F0F50
      UPDATE `events` SET `evt_uid` = (SELECT UPPER(REPLACE(@i:=UUID(),'-','')));
      
      // UID Format: c915ec5a-5ff0-11ea-8f4c-125fc56f0f50
      UPDATE `events` SET `evt_uid` = (SELECT UUID());
      
      // UID Format: C915EC5a-5FF0-11EA-8F4C-125FC56F0F50
      UPDATE `events` SET `evt_uid` = (SELECT UPPER(@i:=UUID()));
      

      【讨论】:

        【解决方案4】:
        UPDATE db.tablename SET columnID = (SELECT UUID()) where columnID is not null
        

        【讨论】:

        • 请添加一些关于您的代码如何工作的解释。没有 cmets 的代码对于其他 SO 用户来说并不总是很容易理解
        • 如果您想更新现有数据中的 uuid,请根据您的条件运行上述查询。
        【解决方案5】:

        我几乎面临同样的问题。 我的情况是 uuid 存储为 BINARY(16) 并且具有 NOT NULL UNIQUE 约束。 当为每一行生成相同的 UUID 并且 UNIQUE 约束不允许这样做时,我遇到了这个问题。所以这个查询不起作用:

        UNHEX(REPLACE(uuid(), '-', ''))

        但对我来说,当我使用这样一个带有嵌套内部选择的查询时:

        UNHEX(REPLACE((SELECT uuid()), '-', ''))

        然后为每个条目生成唯一的结果。

        【讨论】:

          【解决方案6】:

          只是做了一个小补充,因为当我尝试修改 UUID 生成时,我得到了一个奇怪的结果。我发现Rakesh 的answer 是最简单的,效果很好,除非你想去掉破折号。

          供参考:

          UPDATE some_table SET some_field=(SELECT uuid());
          

          这本身就可以完美运行。但是当我尝试这个时:

          UPDATE some_table SET some_field=(REPLACE((SELECT uuid()), '-', ''));
          

          然后所有结果值都是相同的(没有细微的不同 - 我用GROUP BY some_field 查询进行了四次检查)。不管我如何放置括号,都会发生同样的事情。

          UPDATE some_table SET some_field=(REPLACE(SELECT uuid(), '-', ''));
          

          似乎在围绕子查询以使用 REPLACE 生成 UUID 时,它只运行一次 UUID 查询,这对于比我聪明得多的开发人员来说可能是完美的优化,但对我来说却没有。

          为了解决这个问题,我把它分成两个查询:

          UPDATE some_table SET some_field=(SELECT uuid());
          UPDATE some_table SET some_field=REPLACE(some_field, '-', '');
          

          显然是简单的解决方案,但希望这可以节省我刚刚失去的时间。

          【讨论】:

          • 谢谢,您确实为我节省了一些时间。 :)
          【解决方案7】:

          批准的解决方案确实创建了唯一的 ID,但乍一看它们看起来相同,只有前几个字符不同。

          如果你想要明显不同的键,试试这个:

          update CityPopCountry set id = (select md5(UUID()));
          
          
          MySQL [imran@lenovo] {world}> select city, id from CityPopCountry limit 10;
          +------------------------+----------------------------------+
          | city                   | id                               |
          +------------------------+----------------------------------+
          | A Coruña (La Coruña)   | c9f294a986a1a14f0fe68467769feec7 |
          | Aachen                 | d6172223a472bdc5f25871427ba64e46 |
          | Aalborg                | 8d11bc300f203eb9cb7da7cb9204aa8f |
          | Aba                    | 98aeeec8aa81a4064113764864114a99 |
          | Abadan                 | 7aafe6bfe44b338f99021cbd24096302 |
          | Abaetetuba             | 9dd331c21b983c3a68d00ef6e5852bb5 |
          | Abakan                 | e2206290ce91574bc26d0443ef50fc05 |
          | Abbotsford             | 50ca17be25d1d5c2ac6760e179b7fd15 |
          | Abeokuta               | ab026fa6238e2ab7ee0d76a1351f116f |
          | Aberdeen               | d85eef763393862e5fe318ca652eb16d |
          +------------------------+----------------------------------+
          

          我正在使用 MySQL 服务器版本:5.5.40-0+wheezy1 (Debian)

          【讨论】:

          • 就我而言,我需要在生成的 GUID 中使用连字符。我用过这个:SELECT INSERT(INSERT(INSERT(INSERT(MD5(UUID()), 9, 0, '-'), 14, 0, '-'), 19, 0, '-'), 24, 0, '-') 查询不是很漂亮,但它可以完成工作。
          • md5 的唯一性不比 UUID 低吗?我会担心碰撞。
          【解决方案8】:

          看起来像一个简单的错字。你不是说“...where columnId is null”吗?

          UPDATE db.tablename
            SET columnID = UUID()
            where columnID is null
          

          【讨论】:

          • 我在阅读这个问题时也有同样的想法,但我不这么认为:听起来他的列包含值,但不是 UNIQUE 值。早在你的答案之前给出的答案已经表明了需要什么。不应该有WHERE 子句。并且生成的值非常相似,因此必须仔细观察它们才能发现它们确实不同。
          【解决方案9】:
          select @i:=uuid();
          update some_table set guid = (@i:=uuid());
          

          【讨论】:

          • 完美完美完美!!这么小的事情可以产生巨大的影响!
          • 可以确认,最简单且唯一适用于我为多行设置不同 UUID 的解决方案,
          【解决方案10】:

          我需要在现有表中添加一个 guid 主键列并使用唯一的 GUID 填充它,并且这个带有内部选择的更新查询对我有用:

          UPDATE sri_issued_quiz SET quiz_id=(SELECT uuid());
          

          如此简单:-)

          【讨论】:

          • 起初我以为这插入了重复的 UUID,因为它们的开头和结尾都相同,但实际上它们略有不同。
          • @SamBarnum 因为UUID 是基于machine and timestamp 生成的。作为一个需要几毫秒才能运行的查询,它们确实必须非常接近......但永远不会相同......向您保证的一件好事是向该列添加一个 UNIQUE 索引。
          • 与此相比,接受的答案似乎有点矫枉过正!
          • 至少在 mariadb (10.1.26) 这似乎不起作用,为每条记录提供相同的 uuid。
          • 这为我在每条记录上生成了相同的 UUID,大概是因为它在子查询中,MySQL 将首先执行内部查询并对所有行使用相同的值。要解决它,请删除子查询:UPDATE sri_issued_quiz SET quiz_id=uuid();
          【解决方案11】:

          我不确定这是否是最简单的方法,但它确实有效。我们的想法是创建一个为您完成所有工作的触发器,然后执行更新您的表的查询,最后删除此触发器:

          delimiter //
          create trigger beforeYourTableUpdate  BEFORE UPDATE on YourTable
          FOR EACH ROW
          BEGIN
            SET new.guid_column := (SELECT UUID());
          END
          //
          

          然后执行

          UPDATE YourTable set guid_column = (SELECT UUID());
          

          还有DROP TRIGGER beforeYourTableUpdate;

          更新 另一种不使用触发器但需要主键或唯一索引的解决方案:

          UPDATE YourTable,
          INNER JOIN (SELECT unique_col, UUID() as new_id FROM YourTable) new_data 
          ON (new_data.unique_col = YourTable.unique_col)
          SET guid_column = new_data.new_id
          

          UPDATE 再次: 看来您的原始查询也应该可以工作(也许您不需要WHERE columnID is not null,所以不需要我所有花哨的代码。

          【讨论】:

          • 是的,即使在 5.0 中它也应该可以工作。但别忘了放下扳机!
          • 是的,当然 :) 只是想知道我是否需要在之后检查重复项,或者这是否会为列中的每一行创建唯一值?
          • 如果UUID 实现得当(我相信确实如此),您应该能够在不检查重复项的情况下创建唯一索引。
          • 您的原始代码可以工作,只需将 columnId=UUID() 更改为 columnId=(SELECT UUID())。对我来说效果很好。所有生成的值都非常接近相同,但每个值都是唯一的。
          • 请注意@a1ex07 可能想要添加到答案中:在 5.6 中(我没有测试过其他人),如果 columnId=(SELECT UUID()) 在存储过程中,所有UUID 值将相同。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-07-26
          • 2010-12-04
          • 2015-08-19
          • 2011-03-11
          • 1970-01-01
          相关资源
          最近更新 更多