2017-08-11 8 views
4

私の一部のMySQLデータベース(MySQL 5.7.9)のいくつかのテーブルにUUIDを追加しようとしています。 DB内のすべてのエントリは、NULL値を受信して​​いますので、テーブルに既に存在するすべてのエントリのために、私は(UUIDを生成し、その後MySQLは複数の行に対してUUID()を生成します

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

:まず第一に、私はUUIDを受け取るために列を追加することにより開始します。それはUUIDフィールドの中で今

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

、事は私がこれを行うことにより、いくつかの非常に奇妙な動作を得ることである;。私のデータベースの一部に、生成されたすべてのUUIDが一意である(予想通り)しかし、他のデータベースに、生成されたすべてのUUIDは同一(同一ではない)です。

MySQLのクエリオプティマイザが原因であると思われます。これは、動作が異なるデータベースインスタンス間で一貫しないためです(MySQL 5.7.9)。しかし、私はこの問題を解決する方法を知りません。

だから、私は何か間違っていますか?

+1

@TimBiegeleisen。 。 。これは古いバグレポートで、これを修正するコードは10年前にコミットされているはずです。修正がコードベースに組み込まれたことがないかどうか知っていますか? –

+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 ; 
関連する問題