考虑一下:
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函数。我仍然想了解最初的问题。
1条答案
按热度按时间46scxncf1#
我今天遇到了同样的问题(mysql 5.7),并找到了一篇关于它的老文章(2005)。这似乎是我的校勘
https://dev.mysql.com/doc/refman/8.0/en/set-names.html
使用
帮了我的剧本。
用于测试唯一性