我刚刚将一堆数据导入到MySQL表中,我有一个名为“GUID”的列,我想基本上使用新的唯一随机GUID填充所有现有行。
我该如何在MySQL中做到这一点?
我尝试过
UPDATE db.tablename
SET columnID = UUID()
where columnID is not null
只需将每个字段都保持相同即可
我需要在一个已存在的表中添加一个GUID主键列,并将其填充为唯一的GUID,这个带有内部选择的更新查询对我很有效:
UPDATE sri_issued_quiz SET quiz_id=(SELECT uuid());
如此简单 :-)
UUID
是基于 机器和时间戳 生成的。作为一个需要几毫秒运行的查询,它们必须非常非常接近......但永远不会相同......为了确保这一点,一个好的方法是给该列添加一个 UNIQUE
索引。 - balexandreUPDATE sri_issued_quiz SET quiz_id=uuid();
- Chris White我不确定这是否是最简单的方法,但它是有效的。思路是创建一个触发器来完成所有工作,然后执行一个更新表的查询,最后删除这个触发器:
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
),因此我的所有花哨的代码都没有必要。
已批准的解决方案确实创建了唯一的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 INSERT(INSERT(INSERT(INSERT(MD5(UUID()), 9, 0, '-'), 14, 0, '-'), 19, 0, '-'), 24, 0, '-')
这个查询语句不太优美,但它完成了工作。 - soloselect @i:=uuid();
update some_table set guid = (@i:=uuid());
我需要进行一些补充,因为当我尝试修改生成的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(), '-', ''));
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()), '-', ''))
然后为每个条目产生唯一结果。
看起来只是一个简单的错别字。你是不是想说"...where columnId 是 null"?
UPDATE db.tablename
SET columnID = UUID()
where columnID is null
WHERE
子句。生成的值非常相似,因此必须仔细查看它们才能确定它们确实不同。 - ToolmakerSteveMYsql
UPDATE tablename SET columnName = UUID()
oracle
UPDATE tablename SET columnName = SYS_GUID();
SQLSERVER
UPDATE tablename SET columnName = NEWID();;
UPDATE db.tablename SET columnID = (SELECT UUID()) where columnID is not null
SELECT CONCAT(SUBSTRING(REPLACE(UUID(),'-',''), 1, 5), SUBSTRING(UPPER(REPLACE(UUID(),'-','')), 4, 5), SUBSTRING('@#$%(*&', FLOOR(RAND()*(1-8))+8, 1)) pass
选择五个小写字母、五个大写字母和一个特殊字符:SELECT
SET columnID = UUID()
是行得通的 - 只是如果你对大量行做这个操作,UUID 字符的大部分看起来都会是相同的,但细微的差别还是存在的。赞成 PSU 的回答。 - joelc