Answers:
我不确定这是否是最简单的方法,但是可以。这个想法是创建一个可以为您完成所有工作的触发器,然后执行查询以更新您的表,最后删除该触发器:
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 另一个不使用触发器,但需要主键或唯一索引的解决方案:
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
,所以不需要我所有的花哨代码。
UUID
实施正确(我相信是正确的),那么您应该能够创建唯一索引而无需检查重复项。
我需要在现有表中添加一个guid主键列,并用唯一的GUID填充它,而使用内部选择的更新查询对我来说很有效:
UPDATE sri_issued_quiz SET quiz_id=(SELECT uuid());
很简单 :-)
UPDATE sri_issued_quiz SET quiz_id=uuid();
批准的解决方案确实会创建唯一的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)
SELECT INSERT(INSERT(INSERT(INSERT(MD5(UUID()), 9, 0, '-'), 14, 0, '-'), 19, 0, '-'), 24, 0, '-')
查询不是很漂亮,但是可以完成任务。
当我尝试在生成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, '-', '');
很明显,这是一个简单的解决方案,但是希望这可以为我节省一些时间。
看起来像是一个简单的错字。您不是说“ ... where columnId 为 null”吗?
UPDATE db.tablename
SET columnID = UUID()
where columnID is null
WHERE
条款。而且生成的值非常相似,因此必须仔细查看它们以确保它们确实不同。
我几乎都遇到了同样的问题。我的情况是,uuid存储为BINARY(16)并具有NOT NULL UNIQUE约束。当每行都生成相同的UUID时,我遇到了问题,而UNIQUE约束不允许这样做。因此此查询不起作用:
UNHEX(REPLACE(uuid(), '-', ''))
但是对我来说,它有效,当我使用带有嵌套内部选择的查询时:
UNHEX(REPLACE((SELECT uuid()), '-', ''))
然后为每个条目产生唯一的结果。
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()));