自动生成的id

本文介绍了SQL Server中用于获取自动生成标识符的几种方法,包括@@identity、SCOPE_IDENTITY()及IDENT_CURRENT('table')等函数的区别与应用场景。这些函数帮助开发者在插入数据后检索最后生成的标识符。
当运行完插入语句后,执行select @@identity就可得到自动生成的id

如果是sql server 最好用select SCOPE_IDENTITY() as id
因为@@identity全局的

同类还有IDENT_CURRENT(‘table’)

IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回为任何会话和作用域中的特定表所生成的值。
@@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。
SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值

SCOPE_IDENTITY 和 @@IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值。但是,SCOPE_IDENTITY 只返回插入到当前作用域中的值;@@IDENTITY 不受限于特定的作用域。
<think>嗯,我现在要了解MyBatis-Plus自动生成ID的机制。首先,我需要知道在数据库中,主键ID的生成方式有哪些常见的策略,比如自增、UUID、雪花算法等。MyBatis-Plus作为MyBatis的增强工具,应该对这些策略有支持。 用户的问题是关于MyBatis-Plus如何自动生成ID,所以可能需要查看官方文档或者相关教程。我记得MyBatis-Plus提供了注解@TableId来指定主键生成策略。比如@TableId(type = IdType.AUTO)可能就是自增主键,但具体支持哪些类型呢? 然后,不同的数据库对自增的实现可能不同,比如MySQL有AUTO_INCREMENT,而PostgreSQL使用SERIAL或者IDENTITY类型。MyBatis-Plus的自动生成是否兼容这些差异?或者是否需要额外配置? 另外,还有雪花算法生成的分布式ID,这可能涉及到IdType.ASSIGN_ID或者IdType.ASSIGN_UUID。需要确认这些策略的使用方法和适用场景。比如ASSIGN_ID是基于雪花算法,生成的是Long类型的ID,而ASSIGN_UUID则是字符串形式的UUID。 还需要考虑在实体类中如何正确使用这些注解。例如,是否需要在字段上添加@TableId注解,并指定type属性。如果没有指定,MyBatis-Plus的默认策略是什么? 可能还需要示例代码来说明不同的配置方式,比如在application.yml中配置全局的主键策略,或者在实体类中单独指定。同时,要注意不同策略下插入操作时的行为,比如使用自增策略时,插入后是否能获取到生成的ID。 此外,用户可能会遇到问题,比如配置了自增但数据库不支持,或者分布式环境下ID冲突的情况。这时候需要如何排查和解决?可能需要检查数据库的自增设置,或者调整生成策略为分布式友好的算法如雪花ID。 总结一下,回答需要涵盖MyBatis-Plus支持的ID生成策略、如何配置(注解和全局)、不同数据库的注意事项、以及常见问题的解决方法。同时,结构要清晰,分点说明,帮助用户逐步理解。</think>MyBatis-Plus 的自动生成 ID 功能主要通过主键生成策略实现,以下是逐步说明: --- ### 一、核心注解 `@TableId` 在实体类中使用 `@TableId` 注解标记主键字段,通过 `type` 属性指定生成策略: ```java @TableId(type = IdType.AUTO) private Long id; ``` --- ### 二、支持的 ID 生成策略(`IdType` 枚举) 1. **`AUTO`** - 数据库自增 ID - 要求:数据库字段需设置自增(如 MySQL 的 `AUTO_INCREMENT`) - 示例配置: ```sql CREATE TABLE user ( id BIGINT(20) NOT NULL AUTO_INCREMENT, ... ) ``` 2. **`ASSIGN_ID`**(默认策略) - 雪花算法生成 `Long` 类型 ID - 特点:分布式环境下唯一、有序 - 无需数据库支持,由 MyBatis-Plus 自动生成 3. **`ASSIGN_UUID`** - 生成 32 位 UUID 字符串(不含短横线) - 示例:`d89f8e6e5a7d4a2e8d0f3b7c1e6a3d1f` 4. **`NONE`** - 不自动生成,需手动设置 ID 5. **`INPUT`** - 用户自定义 ID(插入前需显式赋值) --- ### 三、全局配置(可选) 在 `application.yml` 中设置默认策略: ```yaml mybatis-plus: global-config: db-config: id-type: assign_id # 默认使用雪花算法 ``` --- ### 四、插入行为示例 ```java User user = new User(); user.setName("John"); // 未手动设置 id userMapper.insert(user); // 插入后自动回填生成的 id System.out.println(user.getId()); ``` --- ### 五、注意事项 1. **`AUTO` 策略需数据库支持** - MySQL/Oracle 等支持自增,PostgreSQL 需使用 `SERIAL` 或 `IDENTITY` 类型 2. **`ASSIGN_ID` 的数值范围** - 生成的是 64 位 Long 类型数值,前端需使用字符串类型避免精度丢失 3. **分布式环境推荐** - 优先选择 `ASSIGN_ID`(雪花算法)避免 ID 冲突 --- ### 六、扩展:自定义 ID 生成器 实现 `IdentifierGenerator` 接口可定制生成逻辑: ```java @Component public class CustomIdGenerator implements IdentifierGenerator { @Override public Number nextId(Object entity) { // 返回自定义 ID(如时间戳+随机数) return System.currentTimeMillis() + RandomUtil.randomInt(1000); } } ``` --- 通过上述配置,MyBatis-Plus 可灵活适配不同场景的 ID 生成需求,兼顾单机与分布式环境。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值