美文网首页
REPLACE(UUID(), '-', '')重复问题

REPLACE(UUID(), '-', '')重复问题

作者: 左轮Lee | 来源:发表于2020-04-20 16:51 被阅读0次
环境:

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 执行结果如下(重复): navicat base on 5.7.png Workbench 8.0.19 执行结果如下(重复): workbench base on 5.7.png DataGrip 执行结果如下(重复): datagrip base on 5.7.png HeidiSQL 11.0.0.5919 执行结果如下(重复): HeidiSQL base on 5.7.png SQLyog 13.1.5 执行结果如下(不重复): SQLyog base on 5.7.png dbForge Studio for MySQL 8.0.40 执行结果如下(不重复): dbforge base on 5.7.png MySQL client 14.14 Distrib 5.7.25 执行结果如下(不重复): MySQL client base on 5.7.png

可见不同的IDE执行结果不相同,执行时需要注意使用的IDE工具。

三、基于8.0版本的不同IDE测试
Navicat 12.1.25 执行结果如下: navicat base on 8.0.png Workbench 8.0.19 执行结果如下: workbench base on 8.0.png DataGrip 执行结果如下: datagrip base on 8.0.png HeidiSQL 11.0.0.5919 执行结果如下: HeidiSQL base on 8.0.png SQLyog 13.1.5 执行结果如下: SQLyog base on 8.0.png dbForge Studio for MySQL 8.0.40 执行结果如下: dbforge base on 8.0.png MySQL client 14.14 Distrib 5.7.25 执行结果如下: MySQL client base on 8.0.png

可见不同的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的问题,待查。

相关文章

网友评论

      本文标题:REPLACE(UUID(), '-', '')重复问题

      本文链接:https://www.haomeiwen.com/subject/kvjrihtx.html