考虑一下:
select uuid() from my_table;
返回不同的UUID:
"fc28ee4e-a147-11e8-93aa-0242ac120002"
"fc28ee7d-a147-11e8-93aa-0242ac120002"
"fc28ee84-a147-11e8-93aa-0242ac120002"
"fc28ee8c-a147-11e8-93aa-0242ac120002"
"fc28ee9b-a147-11e8-93aa-0242ac120002"
但是
select replace (uuid(), '-', '') from my_table;
返回相同的UUID:
"38d37436a14811e893aa0242ac120002"
"38d37436a14811e893aa0242ac120002"
"38d37436a14811e893aa0242ac120002"
"38d37436a14811e893aa0242ac120002"
"38d37436a14811e893aa0242ac120002"
替换功能中的UUID为什么相同?
当我尝试使用UUID作为主键并用一条语句插入行时偶然发现了这个问题。
INSERT INTO my_Table (id, updated_at)
SELECT unhex(replace (uuid(), '-', '')), sysdate() FROM another_table
最奇怪的是,编写此语句的同事为每个插入获取不同的UUID。怎么会来?
我尝试使用HeidiSQL和PhpMyAdmin。
版本信息:
"innodb_version" "5.7.21"
"protocol_version" "10"
"slave_type_conversions" ""
"tls_version" "TLSv1,TLSv1.1"
"version" "5.7.21"
"version_comment" "MySQL Community Server (GPL)"
"version_compile_machine" "x86_64"
"version_compile_os" "Linux"
丑陋的解决方法
使用concat代替几个子字符串:
SELECT unhex(concat(substring(uuid(), 1, 8), substring(uuid(), 10, 4), substring(uuid(), 15, 4), substring(uuid(), 20, 4), substring(uuid(), 25, 12)))
这有效,但是生成的ID不再唯一。因此,真正的罪魁祸首似乎是REPLACE函数。我仍然想了解最初的问题。