Identity Columns是在Oracle版本≥12c中的新特性:自增字段
在自增字段后使用以下2种语句的1种即可完成自增:
- generated by default as identity
- generated always as identity
在userinfo表的基础上,我们来看下区别:
1、使用generated by default as IDENTITY建表
CREATE TABLE userinfo (
id number(11) generated by default as IDENTITY,--使用自增功能
name varchar2(20) ,
age number(3)
)
这种采用的是默认方式去实现字段自增
该方式下,可以手动插入自增字段的值(也就是手动修改自增的数值),如:
insert into userinfo(name,age) values('张三',18) --新增成功
insert into userinfo(id,name,age) values(10,'李四',18) --新增成功
2、使用generated always as identity建表
CREATE TABLE userinfo (
id number(11) generated always as identity,--使用自增功能
name varchar2(20) ,
age number(3)
)
这种方式采用always方式自增,也就是只使用自增值去插入
不能手动去指定自增值,否则报错,如下:
insert into userinfo(name,age) values('张三',18) --新增成功
--新增失败,generated always as identity不能指定自增值
insert into userinfo(id,name,age) values(10,'李四',18)
错误信息:提示我们不能插入
3、区别总结
- generated by default as identity:采用的是默认的自增规则去实现字段自增的,在insert时,不指定自增字段,会默认使用自增值去填充,也支持手动指定自增字段的数值
- generated always as identity:采用always规则去实现字段自增,总是使用自增值去填充,不支持手动指定自增字段的数值
- 一句话:generated by default as identity包含了generated always as identity,能使用generated by default as identity的地方不要使用generated always as identity
4、Java中做好不要使用generated always as identity原因
我们mybatis插入Oracle数据时,在需要获取自增主键的基础上,generated always as identity方式是无法实现的,只能使用generated by default as identity使用,如下:
- 无论是哪种方式,Oracle都会生成一个自增序列,我的自增序列为:iseq$$_53168
- 在mybatis中,useGeneratedKeys和KeyProperty是不支持Oracle的
- 需要在insert标签中使用selectKey标签去实现
而selectKey就是去提前获取自增字段的自增值,再赋值到insert语句中,从而实现主键获取
如下:
<insert id="insertUser" parameterType="com.shuizhu.domain.User">
<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.Integer">
select iseq$$_53168.nextval from dual --"iseq$$_53168"为自动生成的自增序列名称
</selectKey>
insert into userinfo(id,name,age) values(#{id},#{name},#{age})
</insert>
注意:必须在insert语句中写明id,#{id},否则再执行selectKey后,自增+1.再执行insert时,又会自增+1,从而造成获取的自增值与数据库真实存入值不相等
而generated always as identity不支持手动插入指定值,从而insert语句报错