Pertanyaan MySQL menghasilkan UUID () untuk beberapa baris


Saya mencoba menambahkan UUID ke beberapa tabel di beberapa database MySQL saya (MySQL 5.7.9). Pertama-tama, saya mulai dengan menambahkan kolom untuk menerima UUID:

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

Kemudian, untuk semua entri yang sudah ada dalam tabel, saya menghasilkan UUID (karena setiap entri dalam DB akan menerima nilai NULL di dalam bidang UUID.

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

Sekarang, masalahnya adalah saya mendapatkan perilaku yang sangat aneh dengan melakukan ini; pada beberapa basisdata saya, setiap UUID yang dihasilkan adalah unik (seperti yang diharapkan). Namun, pada basis data lainnya, semua UUID yang dihasilkan identik (tidak serupa, identik).

Saya menduga bahwa ini adalah karena pengoptimasi query MySQL, karena perilaku tidak konsisten antara contoh database yang berbeda (semua pada MySQL 5.7.9). Namun, saya tidak tahu bagaimana mengatasi masalah ini.

Jadi, MySQL guru, apakah saya melakukan sesuatu yang salah?


4
2017-08-11 11:14


asal


Jawaban:


Solusi dalam link dari @TimBiegelsen bekerja.

Saya menyatakan fungsi untuk menghasilkan UUID menurut standar v4.

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
2017-08-22 12:47