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

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) --新增成功

使用Oracle数据库的java程序员注意:不要再使用generated always as identity了!_第1张图片

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) 

错误信息:提示我们不能插入

使用Oracle数据库的java程序员注意:不要再使用generated always as identity了!_第2张图片

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语句中,从而实现主键获取

如下:


    
        select iseq$$_53168.nextval from dual --"iseq$$_53168"为自动生成的自增序列名称
    
    insert into userinfo(id,name,age) values(#{id},#{name},#{age})

注意:必须在insert语句中写明id,#{id},否则再执行selectKey后,自增+1.再执行insert时,又会自增+1,从而造成获取的自增值与数据库真实存入值不相等

generated always as identity不支持手动插入指定值,从而insert语句报错

你可能感兴趣的:(mybatis,Oracle,springboot,java,oracle)