一. Oracle中使用序列化来完成主键自增
Oracle数据库中,并没有主键自增这一说法,而是通过序列化完成自增主键值的获取
create table emp_721(
emp_id number(11) primary key,
emp_name varchar2(20) not null,
emp_mail varchar2(30) not null,
emp_gender number(1) not null,
dept_id number(10) not null
);
-- 以下sql报错(没有插入主键),那么如何实现主键自增呢
insert into emp_721 (emp_name,emp_mail,emp_gender,dept_id)
values('张益达','zdp@qq.com',1,1);
-- oracle数据库中要实现主键自增,我们必须使用序列
create sequence seq_2020721;
-- sequence查询
select seq_2020721.nextval from dual; -- 查询下一个值,并使用
select seq_2020721.currval from dual; -- 查询序列当前的使用的值
-- 所以开发中,Oracle数据库表数据新增,对NUmber的主键来说,都使用序列进行自增
insert into emp_721 (emp_id,emp_name,emp_mail,emp_gender,dept_id)
values(seq_2020721.nextval,'张大炮','zdp@qq.com',1,1);
oracle设置序列化;
二. Oracle获取非自增主键的值
BEFORE版:先查询再新增数据
<!--
Oracle环境下获取非自增主键的值
public void insertEmp(Emp emp);
-->
<insert id="insertEmp" databaseId="oracle">
<!--
selectKey : 表示查询一个值,作为新增数据的主键
keyColumn : 数据表中的主键列名
keyProperty : 对应主键实体类的属性名
order:表示是在新增之前执行查询还是新增之后执行查询
BEFORE : 表示新增之前
AFTER : 表示新增之后
-->
<selectKey keyColumn="emp_id" keyProperty="empId" resultType="int" order="BEFORE">
select seq_2020721.nextval from dual
</selectKey>
insert into emp_721(emp_id,emp_name,emp_mail,emp_gender,dept_id) values(#{empId},#{empName},#{empMail},#{empGender},#{deptId})
</insert>
AFTER版:先新增数据,后查询
<!--
Oracle环境下获取非自增主键的值
public void insertEmp(Emp emp);
-->
<insert id="insertEmp" databaseId="oracle">
<!--
selectKey : 表示查询一个值,作为新增数据的主键
keyColumn : 数据表中的主键列名
keyProperty : 对应主键实体类的属性名
order:表示是在新增之前执行查询还是新增之后执行查询
BEFORE : 表示新增之前
AFTER : 表示新增之后
-->
<selectKey keyColumn="emp_id" keyProperty="empId" resultType="int" order="AFTER">
select seq_2020721.currval from dual
</selectKey>
insert into emp_721(emp_id,emp_name,emp_mail,emp_gender,dept_id) values(seq_2020721.nextval,#{empName},#{empMail},#{empGender},#{deptId})
</insert>