环境:
MySQL: 5.7.25-log / 8.0.16
IDE: Navicat / Workbench / datagrip / HeidiSQL / SQLyog / dbForge Studio for MySQL / MySQL client
目录
一、问题提出
二、基于5.7版本的不同IDE测试(不同IDE执行结果不相同)
三、基于8.0版本的不同IDE测试(所有IDE执行结果相同)
四、尝试解决方案
五、遗留问题
一、问题提出
数据库MySQL5.7.25,开发同学发来一个SQL,执行报主键冲突,简化后如下:
mysql> create table test_uuid (uid VARCHAR(50) primary key);
mysql> insert into test_uuid select REPLACE(UUID(), '-', '') FROM information_schema.character_sets LIMIT 3;
1062 - Duplicate entry '0094c5bd82d311eaaf37e86a6406e22a' for key 'PRIMARY'
可见此处的UUID()并没有生成唯一值。
执行下面的SQL发现,UUID()单独执行可以生成唯一值,replace之后就不唯一了,有点诡异。
mysql> SELECT UUID(),REPLACE(UUID(), '-', '') FROM information_schema.character_sets LIMIT 3;
+--------------------------------------+----------------------------------+
| UUID() | REPLACE(UUID(), '-', '') |
+--------------------------------------+----------------------------------+
| b0e919ed-82d3-11ea-af37-e86a6406e22a | b0e917ff82d311eaaf37e86a6406e22a |
| b0e91a02-82d3-11ea-af37-e86a6406e22a | b0e917ff82d311eaaf37e86a6406e22a |
| b0e91a09-82d3-11ea-af37-e86a6406e22a | b0e917ff82d311eaaf37e86a6406e22a |
+--------------------------------------+----------------------------------+
二、基于5.7版本的不同IDE测试
Navicat 12.1.25 执行结果如下(重复):






可见不同的IDE执行结果不相同,执行时需要注意使用的IDE工具。
三、基于8.0版本的不同IDE测试
Navicat 12.1.25 执行结果如下:






可见不同的IDE执行结果相同,均不重复,8.0中已完全解决此问题。
四、尝试解决方案
1.针对MySQL5.7版本查询时的重复问题,可以尝试增加查询来实现UUID不重复,如下:
mysql> select uuid(),REPLACE(UUID(), '-', '') from information_schema.character_sets limit 3;
+--------------------------------------+----------------------------------+
| uuid() | REPLACE(UUID(), '-', '') |
+--------------------------------------+----------------------------------+
| d044aea1-82e0-11ea-af37-e86a6406e22a | d044aead82e011eaaf37e86a6406e22a |
| d044aec1-82e0-11ea-af37-e86a6406e22a | d044aec282e011eaaf37e86a6406e22a |
| d044aec9-82e0-11ea-af37-e86a6406e22a | d044aeca82e011eaaf37e86a6406e22a |
+--------------------------------------+----------------------------------+
3 rows in set (0.00 sec)
## 增加一层查询
mysql> select REPLACE(UUID, '-', '') from (SELECT UUID() as uuid FROM information_schema.character_sets LIMIT 3 )t ;
+----------------------------------+
| REPLACE(UUID, '-', '') |
+----------------------------------+
| da8638f182e011eaaf37e86a6406e22a |
| da86391582e011eaaf37e86a6406e22a |
| da86391a82e011eaaf37e86a6406e22a |
+----------------------------------+
2.MySQL5.7中如果是批量update,应注意使用合适的IDE,或直接在MySQL client中执行。
update test_uuid set uid = replace(UUID(), '-', '');
五、遗留问题
此问题不知是BUG还是IDE的问题,待查。
网友评论