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、序列需要先创建,才能使用;必须获取创建序列的权限。

相关推荐
RainbowSea2 小时前
12. LangChain4j + 向量数据库操作详细说明
java·langchain·ai编程
RainbowSea2 小时前
11. LangChain4j + Tools(Function Calling)的使用详细说明
java·langchain·ai编程
考虑考虑6 小时前
Jpa使用union all
java·spring boot·后端
用户3721574261356 小时前
Java 实现 Excel 与 TXT 文本高效互转
java
RestCloud7 小时前
SQL Server到Hive:批处理ETL性能提升30%的实战经验
数据库·api
RestCloud7 小时前
为什么说零代码 ETL 是未来趋势?
数据库·api
浮游本尊7 小时前
Java学习第22天 - 云原生与容器化
java
ClouGence9 小时前
CloudCanal + Paimon + SelectDB 从 0 到 1 构建实时湖仓
数据库
渣哥9 小时前
原来 Java 里线程安全集合有这么多种
java
间彧9 小时前
Spring Boot集成Spring Security完整指南
java