常用的主键生成策略
主键生成策略是指在数据库中为每条记录生成唯一标识符的方法。常用的主键生成策略有以下几种:
-
自增长(自动编号):每添加一条记录,自动加 1;优点是能够保证主键唯一,缺点是无法在分布式系统中实现。
-
UUID/GUID:采用随机算法生成的字符串,理论上能够保证不重复,但主键长度较长,不便于存储和索引。
-
分布式ID生成器:采用雪花算法、UID、美团Leaf等算法生成的主键,能够在分布式系统中实现全局唯一,且主键长度较短,但实现略复杂。
-
数据库序列(Sequence):一种由数据库提供的生成主键的方法,能够保证主键唯一,但无法在分布式系统中实现。
-
组合主键:将多个字段组合成一个主键,能够保证唯一性,但可能存在冗余数据和空值。
Java中的主键生成策略
在Java中,给实体类定义主键时一般需要指定主键生成策略,常用的主键生成策略有以下几种:
-
自增长策略(GenerationType.IDENTITY) 这种策略是指数据库自动为每一行添加一个唯一的标识列,并且在插入数据时自动递增。在MySQL中,可以使用AUTO_INCREMENT关键字来定义自增长列。
-
序列策略(GenerationType.SEQUENCE) 序列策略是指使用数据库中的序列生成主键,序列是一种特殊的对象,可以自动创建一组连续的数字。在Oracle中,可以使用CREATE SEQUENCE语句来定义序列。
-
表策略(GenerationType.TABLE) 表策略是指在数据库中定义一个专门用于生成主键的表,包含了一个主键字段和一个取值字段。在插入数据时,先从这个表中获取一个值作为主键,并且同时更新取值字段的值,确保每个主键都是唯一的。
-
UUID策略(GenerationType.UUID) UUID策略是指使用Java中的UUID来生成主键,UUID是一种通用唯一标识符,可以作为主键使用。
在JPA中,可以通过@Entity注解为实体类定义主键生成策略,例如:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // 指定自增长策略
private Long id;
...
}
雪花算法(Snowflake ID Algorithm)
雪花算法是一种用于生成全局唯一ID的算法,它的全名为雪花ID算法(Snowflake ID Algorithm)。该算法产生的ID是一个64位的整型数,由三部分组成:时间戳 + 机器ID + 序列号。其中,时间戳占41位,可以精确到毫秒级别;机器ID占10位,可以支持1024台机器;序列号占12位,可以支持每台机器每毫秒产生4096个ID。因此,雪花算法可以在分布式系统中生成唯一的ID,保证ID的唯一性和有序性,同时也支持高并发的ID生成需求。
在实际应用中,可以根据业务需求进行灵活的配置,例如调整时间戳的起始时间、机器ID的分配方式等等,以满足不同的业务场景。
@Data
public class User {
// @TableId(type = IdType.AUTO)自动增长
/* MyBatils_Plus自带策略
@TableId(type = IdType.ID_WORKER)//会生成一个19位的值,数字类型使用这种类型,比如long
@TableId(type = IdType.ID_WORKER_STR)//会生成一个19位的值,字符串类型使用这种类型,比如String
*/
// @TableId(type = IdType.INPUT)自己设置ID
// @TableId(type = IdType.NONE)//不用任何策略,自己设置
// @TableId(type = IdType.UUID)//每次生成随机唯一的值
private Long id;
private String name;
private Integer age;
private String email;
}