在MySQL中为现有数据生成GUID?

Tom*_*Tom 85 mysql random guid

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

我如何在MySQL中执行此操作?

我试过了

UPDATE db.tablename
  SET columnID = UUID()
  where columnID is not null
Run Code Online (Sandbox Code Playgroud)

只是让每个领域都一样

小智 98

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

UPDATE sri_issued_quiz SET quiz_id=(SELECT uuid());
Run Code Online (Sandbox Code Playgroud)

很简单 :-)

  • 起初我认为这已经插入了重复的UUID,因为它们都以相同的方式开始和结束,但它们实际上略有不同. (30认同)
  • 这为我在每条记录上生成了相同的 UUID,大概是因为它在子查询中,而 MySQL 将首先执行内部查询并对所有行使用相同的值。要解决它,请删除子查询:`UPDATE sri_issued_quiz SET quiz_id=uuid();` (5认同)
  • @SamBarnum因为`UUID`是基于[机器和时间戳](http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_uuid)生成的.作为一个需要几毫秒才能运行的查询,它们必须非常非常接近......但是从来没有相同......向你保证,就是在该列中添加一个`UNIQUE`索引. (3认同)
  • 相较于此,可接受的答案似乎有些过分! (2认同)
  • 至少在mariadb(10.1.26)中,这似乎不起作用,因为每条记录都使用相同的uuid。 (2认同)

a1e*_*x07 81

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

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

然后执行

UPDATE YourTable set guid_column = (SELECT UUID());
Run Code Online (Sandbox Code Playgroud)

而且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
Run Code Online (Sandbox Code Playgroud)

再次更新:似乎您的原始查询也应该工作(也许您不需要WHERE columnID is not null,因此不需要我所有的花哨代码.

  • 您的原始代码将起作用,只需将columnId = UUID()更改为columnId =(SELECT UUID()).对我来说很棒.所有生成的值都非常接近,但每个值都是唯一的. (2认同)

小智 19

批准的解决方案确实创建了唯一的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 |
+------------------------+----------------------------------+
Run Code Online (Sandbox Code Playgroud)

我使用的是MySQL Server版本:5.5.40-0 + wheezy1(Debian)

  • md5不比UUID独特吗?我担心碰撞. (8认同)
  • 就我而言,我在生成的GUID中需要连字符.我使用了这个:`SELECT INSERT(INSERT(INSERT(INSERT(MD5(UUID()),9,0,' - '),14,0,' - '),19,0,' - '),24, 0,' - ')`查询不是很漂亮,但它完成了工作. (5认同)

小智 11

select @i:=uuid();
update some_table set guid = (@i:=uuid());
Run Code Online (Sandbox Code Playgroud)

  • 完美完美完美!!这么小的事情能产生巨大的影响!! (2认同)

Hug*_*o R 6

数据库管理系统

UPDATE tablename   SET columnName = UUID()
Run Code Online (Sandbox Code Playgroud)

甲骨文

UPDATE tablename   SET columnName = SYS_GUID();
Run Code Online (Sandbox Code Playgroud)

SQL服务器

UPDATE tablename   SET columnName = NEWID();;
Run Code Online (Sandbox Code Playgroud)


eno*_*rev 5

只是一个小小的补充,因为我在尝试修改生成的UUID时得到了一个奇怪的结果.我找到了答案通过拉克什是最简单的运作良好,除了要剥去破折号案件.

以供参考:

UPDATE some_table SET some_field=(SELECT uuid());
Run Code Online (Sandbox Code Playgroud)

这本身就完美无缺.但是当我尝试这个时:

UPDATE some_table SET some_field=(REPLACE((SELECT uuid()), '-', ''));
Run Code Online (Sandbox Code Playgroud)

然后所有得到的值都是相同的(不是微妙的不同 - 我用GROUP BY some_field查询检查了四倍).无论我如何定位括号,都会发生同样的事情.

UPDATE some_table SET some_field=(REPLACE(SELECT uuid(), '-', ''));
Run Code Online (Sandbox Code Playgroud)

在围绕子查询生成带有REPLACE的UUID时,它似乎只运行一次UUID查询,这对于比我更聪明的开发人员的优化可能是完全合理的,但它对我没有.

要解决此问题,我只需将其拆分为两个查询:

UPDATE some_table SET some_field=(SELECT uuid());
UPDATE some_table SET some_field=REPLACE(some_field, '-', '');
Run Code Online (Sandbox Code Playgroud)

显然,简单的解决方案,但希望这将节省一些我失去的时间.