2017-08-11 965 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 ;