在MySQL中为现有数据生成GUID?
我刚刚导入了一堆数据到一个MySQL表,我有一个列“GUID”,我想基本上用新的和唯一的随机GUID填充所有现有的行。
我如何在MySQL中做到这一点?
我试过了
UPDATE db.tablename SET columnID = UUID() where columnID is not null
只是让每个领域都一样
我不确定这是不是最简单的方法,但它的工作原理。 这个想法是创build一个为你工作的触发器,然后执行一个更新你的表的查询,最后删除这个触发器:
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
;
更新不使用触发器,但需要主键或唯一索引的另一个解决scheme:
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填充它,这个更新查询与内部select为我工作:
UPDATE sri_issued_quiz SET quiz_id=(SELECT uuid());
很简单 :-)
获得批准的解决scheme确实创build了唯一的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)
select @i:=uuid(); update some_table set guid = (@i:=uuid());
看起来像一个简单的错字。 你是不是指“… where columnId 为 null”?
UPDATE db.tablename SET columnID = UUID() where columnID is null
在尝试修改生成的UUID时,我只是做了一个小小的补充,结果出现了一个奇怪的结果。 我发现Rakesh的答案是最简单的,除非你想去掉破折号。
以供参考:
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, '-', '');
很明显,简单的解决scheme,但希望这可以节省一些我刚刚失去的时间。