小白请教如何在mysql数据库中使用uuid为主键

小白请教如何在mysql数据库中使用uuid为主键,第1张

MYSQL

中表1需要准备大量数据,内容主要取自表2,id必须为32位uuid

(项目所有表都是这样,没办法),

准备这样插入:

1

INSERT

INTO

TBL_ONE

(ID,

SOID,

SNAME)

SELECT

2

REPLACE

(UUID(),

'-',

''),

3

TWOID,

4

TWONAME

5

FROM

6

TBL_TWO

TWO

报错:

Duplicate

entry

'4534c15dc2a111e6a9ab000ec6c596eb'

for

key

'PRIMARY',显然主键冲突了,

REPLACE

(UUID(),

'-',

'')

仅执行了一次,

找了半天,似乎也没有最简单的解决方案。退而求其次,我想到的最简单解决方案:

1

INSERT

INTO

TBL_ONE

(ID,

SOID,

SNAME)

SELECT

2

UUID(),

#UUID()为什么可以?

3

TWOID,

4

TWO

NAME

5

FROM

6

TBL_TWO

TWO;7

8

UPDATE

TBL_ONE

SET

ID

=

REPLACE

(ID,

'-',

'');

uuid()生成的id不会重复,但是会有"-",用空格替换一下就ok了。

那么我们先看看什么是UUID?简单的说,UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。在UUID的算法中,可能会用到诸如网卡MAC地址,IP,主机名,进程ID等信息以保证其独立性

优点:

能够保证独立性,程序可以在不同的数据库间迁移,效果不受影响。

保证生成的ID不仅是表独立的,而且是库独立的,这点在你想切分数据库的时候尤为重要。

缺点:

比较占地方,和INT类型相比,存储一个UUID要花费更多的空间。

使用UUID后,URL显得冗长,不够友好

那么如何生成UUID,一个自动生成不重复文本的函数,Hibernate提供的uuid

hibernate中的uuid是自动生成主键的一种机制,但是它依赖于hiberbate包,刚刚将它从Hibernate中提取出来,(从其他博客和公司的组件代码中发现了UUID的生成类)供各位使用

下面针对上述UUID的缺点说说我的看法,比较占地方这个缺点我不是很在乎,现在最不值钱的就是硬盘了,略过此条缺点无妨。至于说使用UUID后,URL显得不友好,我觉得这多少是你的INT情结造成的惯性思维,其实,和INT类型相比,UUID才是最自然的主键选择,注意,我这里用的是自然这个形容词,仔细体会一下你能理解我的意思。另外,很多时候,URL本身就不需要友好,比如,一个电子商务网站,按照INT友好的URL说法,她的订单URL大概是下面这个形式的:/orderphp/id/123,我要说明的是,这样是很友好,但是有些太友好了,友好的甚至不安全,比如说,我早晨下一个订单,发现URL是/orderphp/id/1000,晚上再下一个订单发现URL是/orderphp/id/2000,那么我就可以估计出此网站一天的订单数大致是1000左右,甚至能大体估计出它的销售额,而这些数据往往都是重要的商业秘密。使用UUID就没有这个顾虑。

有的。不过默认的安装并未带这些函数,是需要作为扩展SQL安装上去的。函数名为uuid开头的,类似uuid_generate_xxx。 另外,PostgreSQL从91开始安装的方式有些不同,这些需要再搜索。 我用的PostgreSQL 93, 使用命令create extension "uuid-oos

update test set id = UUID();MYSQL无法在默认值中设置UUID函数,实际上其它函数除TIMESTAMP之外都不可以。 MYSQL的默认值目前只能是常数或者CURRENTTIMESTAMP。

以上就是关于小白请教如何在mysql数据库中使用uuid为主键全部的内容,包括:小白请教如何在mysql数据库中使用uuid为主键、为什么是UUID做主键、如何在postgressql中创建uuid函数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/10167224.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存