MySQL是否在语句中仅对UUID()进行一次评估?

时间:2018-08-16 11:39:52

标签: mysql uuid

考虑一下:

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函数。我仍然想了解最初的问题。

0 个答案:

没有答案