数据库主键id自增的方法,列举了几种如下
一、数据库自增(部分数据库支持)
创建表的时候设置id自增即可,或者后期修改表id自增
# mysql 语法
create table your_table_name(
id bigint(20) not null auto_increment primary key comment '主键', // auto_increment 表示自增(固定死id从1开始,每次加1)
name varchar(24) not null
);
# sqlserver 语法
create table [dbo].[your_table_name] (
[id] int primary key identity(1,1) not null,// identity(1,1) 表示自增(支持id从N开始,每次加M,这里N,m都=1)
[name] varchar(24) not null
);
二、序列号 (适合oracle)
# 创建序列号
create sequence user_seq
minvalue 1 --最小值
nomaxvalue --最大值
start with 1 --起始值
increment by 1 --增长基数
nocycle --不循环一直增加
nocache ; -- 不使用缓存
# 插入数据
insert into user (user_id, user_name, sex) values (user_seq.nextval, #{userName}, #{sex});
三、mybatis获取自增 (通用)
sql语句被执行的时候会自动带上主键字段和填充值去执行,语句中就不用写id字段了。useGeneratedKeys属性默认是false的,keyProperty对应实体对象里面的主键id字段名称,keyColumn对应数据库的字段名称
<insert id="addUser" parameterType="com.yulisao.User" useGeneratedKeys="true"
keyProperty="userId" keyColumn="user_id">
insert into user (user_name, sex) VALUES (#{userName}, #{sex})
</insert>
如果是注解形式的sql,写法如下
@Insert("<script>insert into user (user_name, sex) values (#{userName}, #{sex})</script>")
@Options(useGeneratedKeys=true, keyProperty="userId", keyColumn="user_id")
Integer addUser(User user);
或者自定义取id值
<insert id="addUser" parameterType="com.yulisao.User" useGeneratedKeys="true"
keyProperty="userId">
<selectKey keyProperty="userId" resultType="int" order="BEFORE"> <!-- order 属性的值和数据库有关, mysql是 after,oracle是 before -->
<!-- 自己查询最后使用的id -->
select isnull(max(user_id)+1, 1) as userId from user <!-- sqlserver语法-->
<!-- select 你创建的序列名称.nextval from dual --><!-- oracle 查询最后使用的id -->
<!-- select LAST_INSERT_ID() --><!-- mysql 查询最后使用的id -->
<!-- select SCOPE_IDENTITY() --><!-- sqlserver 查询最后的id -->
</selectKey>
insert into user (user_name, sex) values (#{userName}, #{sex});
</insert>
拓展知识
-
<insert>
标签包含属性如下
- id :唯一标识,每条sql语句的id都不一样,如果有重复启动项目时应该会报错
- parameterType :入参的类名或别名 可选(MyBatis可自动推断入参类型)
- resultType : 返回结果的类名或别名
- flushCache :默认值为 true ,任意执行一次都会清空一级缓存和二级缓存
- timeout :超时时间 单位秒
- statementType :对于 STATEMENT、PREPARED、ALLABLE, MyBatis 会分别使用对应的 Statement、PreparedStatement、Callable tatement ,默认PREPARED
- useGeneratedKeys :默认值为false ,如果设置为true, MyBatis 使用 JDBC - getGeneratedKeys 方法来取出由数据库内部生成的主键
- keyProperty: MyBatis 通过 getGeneratedKeys 获取到的主键id值将要赋值给哪个字段名称(即实体对象里面的驼峰形式userId)
- keyColumn :只对insert有效,生成的列名是什么 (即数据库表的下划线形式字段名称user_id)是否必须与数据库类型有关,比如PostgreSQL必须
- databaseId :一个项目用到多个数据库/数据源才使用这个属性。如果配置了 databaseIdProvider,MyBatis 会加载所有的不带 databaseId 或匹配当前 databaseId 的语句;如果带或者不带的语句都有,则不带的会被忽略。即如果在mybatis的配置文件中没有配置 databaseIdProvider,则databaseId属性不会生效。
更多属性,以及其他标签的属性可以看这里(从XXXMapper.xml里面按住ctrl点击标签或者属性跳进来)
有时候用了useGeneratedKeys 属性但并不生效,也可以参考以下原因
- 设置keyProperty,keyColumn 的值不正确
- 数据库的id字段必须设置为自增的
- 入参有@Param修饰 会导致id无法自动赋值
最后,通过触发器、事件等去实现id自增的方法就不是很推荐了,所以不举例了。