Java唯一键实现方案

数据唯一性

在Java项目开发中,对数据的唯一性要求,业务数据入库的时候保持单表只有一条记录,因此对记录中要求有唯一可区分的ID,主要可使用以下几种方案。

1、生成UUID

主要有两种方式:Java调用uuid类 或者 使用MySQL 数据库中函数实现。

1.1 代码中实现

直接在类中引用 UUID包,使用 randomUUID方法即可,代码如下所示。

java 复制代码
java.util.UUID
public String getSerialNo(){
	UUID uuid = UUID.randomUUID();
	String uuidStr = uuid.toString().replace("-", "");
	return uuidStr;
}

1.2 数据库中实现

使用UUID函数自动生产ID,作为数据的唯一ID,存放到数据库中。

sql 复制代码
select UUID() as str,REPLACE(UUID(),'-','') as newStr

优点

1、直接调用uuid函数即可生成

缺点

1、可能有重复,生成的结果不好记忆

2、数据库递增主键

在数据库建表时,即可指定ID为递增,即AUTO_INCREMENT,当业务数据入库时,则无需获取主键ID,建表脚本如下所示。

sql 复制代码
CREATE TABLE `tb_sku` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `sku_id` bigint(20) DEFAULT NULL COMMENT '商品ID',
  `sku_name` varchar(128) DEFAULT NULL COMMENT '商品名称',
  `is_enable` tinyint(4) DEFAULT NULL COMMENT '是否有效 1 有效 0 无效',
  `is_delete` tinyint(4) DEFAULT NULL COMMENT '是否已删除 : 是否已删除',
  `remark` varchar(256) DEFAULT NULL COMMENT '备注',
  `created_by` varchar(20) DEFAULT NULL COMMENT '创建人 ID',
  `created_time` datetime DEFAULT NULL COMMENT '创建时间',
  `modified_by` varchar(20) DEFAULT NULL COMMENT '修改人 ID',
  `modified_time` datetime DEFAULT NULL COMMENT '修改时间',
  `field1` varchar(128) DEFAULT NULL COMMENT '预留字段1',
  `field2` varchar(128) DEFAULT NULL COMMENT '预留字段2',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `sku_id` (`sku_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品表';

优点

1、建表时即可指定

3、数据库递增序列

3.1 创建序列

对于不需要取数据库主键的场景,可自定义序列,使用 create sequence命令,即可创建序列。

sql 复制代码
// 创建序列
create sequence serial_no_sequence INCREMENT BY 1 strat with 1;

sequence创建知识

INCREMENT BY 每次增加步长

strat with 指定从起始位开始增长

3.2 使用序列

对应创建的序列,直接select查询使用即可,命令如下所示。

sql 复制代码
// 查询序列
select serial_no_sequence.nextval;

优点

1、可自定义序列的名称,步长,起始等

缺点

1、序列需要先创建,才能使用;必须获取创建序列的权限。

相关推荐
zxrhhm16 分钟前
MySQL 8.4 LTS 数据库巡检脚本
数据库·mysql
雨奔18 分钟前
Kubernetes DNS 完全指南:服务发现核心机制与实践
java·kubernetes·服务发现
AI木马人33 分钟前
9.【AI任务队列实战】如何在高并发下保证系统不崩?(Redis + Celery完整方案)
数据库·人工智能·redis·神经网络·缓存
逻辑驱动的ken1 小时前
Java高频面试考点场景题14
java·开发语言·深度学习·面试·职场和发展·求职招聘·春招
阿冰冰呀1 小时前
互联网大厂Java求职面试实录:谢飞机的“水货”之路
java·mybatis·dubbo·springboot·线程池·多线程·hashmap
2401_883600251 小时前
golang如何理解weak pointer弱引用_golang weak pointer弱引用总结
jvm·数据库·python
水无痕simon1 小时前
1.单机部署Nacos1.3.2
java
aLTttY1 小时前
【Redis实战】分布式锁的N种实现方案对比与避坑指南
数据库·redis·分布式
2301_773553621 小时前
mysql如何评估SQL语句的索引开销_mysql性能追踪与分析
jvm·数据库·python
pele2 小时前
PHP源码运行受主板供电影响吗_供电相数重要性说明【技巧】
jvm·数据库·python