mysql is uuid()在语句中只计算一次?

ktecyv1j  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(412)

考虑一下:

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"

为什么在replace函数中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代替replace:

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

46scxncf

46scxncf1#

我今天遇到了同样的问题(mysql 5.7),并找到了一篇关于它的老文章(2005)。这似乎是我的校勘
https://dev.mysql.com/doc/refman/8.0/en/set-names.html
使用

set names utf8;

帮了我的剧本。
用于测试唯一性

SELECT COUNT(DISTINCT u)
FROM (SELECT uuid() as u from my_table) as A

相关问题