首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL为多行生成UUID()

问MySQL为多行生成UUID()
EN

Stack Overflow用户
提问于 2017-08-11 19:14:45
回答 3查看 9.3K关注 0票数 9

我正在尝试将UUID添加到我的一些MySQL数据库(MySQL 5.7.9)中的一些表中。首先,我添加一个接收UUID的列:

代码语言:javascript
复制
ALTER TABLE `mytable` ADD COLUMN `Uuid` BINARY(16) DEFAULT NULL;

然后,对于表中已经存在的所有条目,我都会生成UUID (因为DB中的每个条目在其UUID字段中都会收到一个空值。

代码语言:javascript
复制
UPDATE `mytable` SET Uuid= unhex(replace(uuid(),'-','')) WHERE Uuid IS NULL;

现在,问题是我通过这样做得到了一些非常奇怪的行为;在我的一些数据库中,生成的每个UUID都是唯一的(正如预期的那样)。但是,在其他数据库上,所有生成的UUID都是相同的(不相似,相同)。

我怀疑这是由于MySQL查询优化器造成的,因为不同数据库实例(都在MySQL 5.7.9上)之间的行为并不一致。然而,我不知道如何解决这个问题。

那么,MySQL大师,我是不是做错了什么?

EN

回答 3

Stack Overflow用户

发布于 2019-02-20 10:07:18

我也有同样的问题,但解决方案是链接问题的later answer。我有一个默认字符集utf8mb4,原理是在执行sql之前,它会隐式地将uuid()的utf8结果转换为常量字符串。将其他参数转换为utf8可以避免这种情况:

代码语言:javascript
复制
UPDATE `mytable` SET Uuid= unhex(replace(uuid(), _utf8'-', _utf8'')) WHERE Uuid IS NULL;

后面的答案链接到relevant (not a) bug report。This SO issue看起来是相关的。

票数 6
EN

Stack Overflow用户

发布于 2017-08-22 20:47:37

来自@TimBiegelsen的link中的解决方案可以工作。

我声明了一个函数来根据v4标准生成UUID。

代码语言:javascript
复制
CREATE FUNCTION uuid_v4()
    RETURNS BINARY(16)
BEGIN
    -- Generate 8 2-byte strings that we will combine into a UUIDv4
    SET @h1 = LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0');
    SET @h2 = LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0');
    SET @h3 = LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0');
    SET @h6 = LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0');
    SET @h7 = LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0');
    SET @h8 = LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0');

    -- 4th section will start with a 4 indicating the version
    SET @h4 = CONCAT('4', LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'));

    -- 5th section first half-byte can only be 8, 9 A or B
    SET @h5 = CONCAT(HEX(FLOOR(RAND() * 4 + 8)),
                LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'));

    -- Build the complete UUID
    RETURN UNHEX(LOWER(CONCAT(@h1, @h2, @h3, @h4, @h5, @h6, @h7, @h8)));
END;;
DELIMITER ;
票数 1
EN

Stack Overflow用户

发布于 2021-04-14 00:32:19

最佳解决方案是:

UPDATE mytable SET Uuid= MID(UUID(),1,36) WHERE Uuid IS NULL;

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45633863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档