使用Oracle数据库的java程序员注意:不要再使用generated always as identity了!

14 篇文章 0 订阅
14 篇文章 0 订阅

Identity Columns是在Oracle版本≥12c中的新特性:自增字段

在自增字段后使用以下2种语句的1种即可完成自增:

  1. generated by default as identity
  2. 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语句报错

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

睡竹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值