浅谈UUID主键

前段时间经理让使用UUID设置为主键,UUID可以自动生成一个36字符组成的字符串,UUID是由10个阿拉伯数字加上26个字母组成,8-4-4-4-12的形式组成,例如:4c47cf4a-a55a-4fce-8cd9-024a790714b010。由此可见UUID会产生无数种的组合,不用担心会产生重复。

产生UUID的方法也很简单:

String uuid=UUID.randomUUID().toString();

那使用UUID自动生成主键有什么好处呢?平时常用到自动生成主键的方式就是序列,在Oracle中写一个序列,将触发器写在Oracle中或者写在Java代码中,这样就有一个问题,当需要迁移数据库的时候,容易将序列遗忘使得程序无法运行。

有些人会选择复合主键,或者用业务的某个信息作为主键。早期的数据库设计,大多都是用业务信息做主键,在实践中吃了很多亏后,大家更认同用业务无关的字段来做主键。比如用订单编号来做主键,开始大家觉得订单编号应该是唯一的编号。随着业务的变化,客户在使用中提出,订单可以作废,但是该记录不能删除,而且需要新建一个具有相同订单编号的订单,麻烦来了。

综上所述,用UUID作为主键有他的优越性:

1、操作产生简单;

2、维护简单;

3、不会产生重复值;

4、使得主键与业务分离开来。


### 使用 UUID 作为主键的最佳实践 在 MySQL 数据库中使用 UUID 作为主键具有独特的优势,尤其是在分布式环境中。然而,在实现过程中需要注意一些细节以确保最佳性能。 #### 创建表结构 当创建带有 UUID 主键的表格时,建议定义 `CHAR(36)` 类型列并设置为 `NOT NULL` 和 `UNIQUE` 属性。为了简化操作流程,可以通过默认值的方式自动生成新的 UUID 值[^2]: ```sql CREATE TABLE users ( user_uuid CHAR(36) PRIMARY KEY DEFAULT (UUID()), username VARCHAR(50), email VARCHAR(100) ); ``` 上述 SQL 语句会建立一张名为 `users` 的表,其中 `user_uuid` 字段将自动填充由 `UUID()` 函数产生的唯一标识符。 #### 插入数据 向包含 UUID 主键的表内插入记录非常简单,只需省略该字段即可让其自行生成: ```sql INSERT INTO users(username, email) VALUES ('john_doe', 'john@example.com'); ``` 执行这条命令之后,系统将会为新加入的数据行分配独一无二的 `user_uuid` 值。 #### 查询优化 尽管 UUID 提供了全局唯一性的优势,但由于其长度较长且随机分布特性可能导致索引效率降低。因此对于高并发读取场景下的应用来说,可能还需要考虑其他因素来平衡查询速度与存储成本之间的关系[^1]。 #### 处理特殊字符 由于标准格式下生成的 UUID 含有连字符 `-` ,这可能会引起与其他系统的兼容性问题。为了避免这种情况发生,可以在保存之前利用 `REPLACE` 函数移除这些不必要的符号[^4]: ```sql SET @raw_uuid = UUID(); UPDATE some_table SET uuid_field=REPLACE(@raw_uuid,'-',''); ``` 以上代码片段展示了如何先获取原始形式的 UUID 并将其转换成无分隔线版本再更新到指定字段之中。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值