2017-08-11 963 views
4

我试图添加UUID到我的一些MySQL数据库(MySQL 5.7.9)中的某些表。首先,我开始通过添加一列接收的UUID:MySQL为多行生成UUID()

ALTER TABLE `mytable` ADD COLUMN `Uuid` BINARY(16) DEFAULT NULL; 

然后,对于已经在表中的所有项目,我生成UUID(因为在数据库中的每个条目都会收到一个NULL值。在它的UUID场

UPDATE `mytable` SET Uuid= unhex(replace(uuid(),'-','')) WHERE Uuid IS NULL; 

现在,事情是我做这个得到一些非常怪异的行为;对我的一些数据库,生成的所有UUID是唯一的(如预期),但对其他数据库,所有生成的UUID是相同的(不相似,相同)。

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

因此,MySQL的大师,我做错了什么?

+1

@TimBiegeleisen。 。 。这是一个旧的bug报告,修复它的代码应该在十年前就已经提交。你知道这个修补程序是否从未纳入代码库? –

+0

可能的重复:https://stackoverflow.com/questions/9750536/mysql-uuid-duplication-bug –

+0

@GordonLinoff他的查询是用相同的时间戳重复调用UUID,至少这是我的猜测。你知道解决方法吗? –

回答

1

来自@TimBiegelsen的link解决方案的工作原理。

我声明了一个按照v4标准生成UUID的函数。

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 ;