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

我刚刚导入了一组数据到一个 MySQL 表中,我有一个“ GUID”列,我想用新的和唯一的随机 GUID 来填充所有现有的行。

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

我尽力了

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

每个字段都要相同

243833 次浏览

我不知道这是不是最简单的方法,但是很有效。其思想是创建一个触发器,它为您完成所有工作,然后执行一个查询,更新表,最后删除这个触发器:

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

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

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

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

如此简单: -)

select @i:=uuid();
update some_table set guid = (@i:=uuid());

看起来是个简单的打字错误,你的意思不是“ ... where columnId null”吗?

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

经过批准的解决方案确实创建了惟一的 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 Server 版本: 5.5.40-0 + wheezy1(Debian)

当我试图修改生成的 UUID 时,得到了一个奇怪的结果,这只是一个小小的补充。我发现 拉凯什回答是最简单的,工作得很好,除了在你想去掉破折号的情况下。

参考资料:

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, '-', '');

很简单的解决办法,但希望这能节省一些人的时间,我刚刚失去了。

我也面临着同样的问题。 我的大小写 uuid 存储为 BINARY (16) ,并且有 NOT NULL UNIQUE 约束。 当为每一行生成相同的 UUID 时,我遇到了这个问题,而 UNIQUE 约束不允许这样做。因此,这个查询不起作用:

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

但是对我来说,当我使用嵌套的内部选择查询时,它起作用了:

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

然后对每个条目产生唯一的结果。

MYsql

UPDATE tablename   SET columnName = UUID()

神谕

UPDATE tablename   SET columnName = SYS_GUID();

SQLSERVER

UPDATE tablename   SET columnName = NEWID();;
UPDATE db.tablename SET columnID = (SELECT UUID()) where columnID is not null
// 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()));

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

SELECT CONCAT(SUBSTRING(REPLACE(UUID(),'-',''), 1, 5), SUBSTRING(UPPER(REPLACE(UUID(),'-','')), 4, 5), SUBSTRING('@#$%(*&', FLOOR(RAND()*(1-8))+8, 1)) pass

我做了这个 SELECT,五个字符小写,五个字符大写和一个特殊字符。