Mybatis使用Oracle数据库主键自增
一、关于mysql和oracle主键自增
我们知道在mysql中主键设置为int类型,然后设置AUTO_INCREMENT,则在插入数据的时候mapper中的sql文件是可以不写主键这个字段,数据库就会自动补全一个自增的主键值,但是在oracle中没有AUTO_INCREMENT这个设置方式,那么这个主键应该怎么实现呢?目前根据系统中常用的方式总结了一下,大致包括以下四种:
1、使用序列号,插入sql中写入id字段,并且将值设置为序列号的下一个值(需要创建一个为seq_student的序列号)
比如MAPPER中sql像下面这样
<insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.test.student" useGeneratedKeys="false">insert into student( id,name)values (seq_student.nextval,#{name,jdbcType=VARCHAR})</insert>
2、使用序列号,跟mybatis一样插入sql中不写id字段,然后创建一个插入数据的触发器(需要创建一个为seq_student的序列号和student_id_TRIG的触发器)
比如MAPPER中sql像下面这样
<insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.test.student" useGeneratedKeys="false">insert into student( name)values (#{name,jdbcType=VARCHAR})</insert>
创建触发器如下:
CREATE OR REPLACE TRIGGER student_id_TRIG BEFORE INSERT OR UPDATE ON student
FOR EACH ROW
DECLARE
v_newVal NUMBER(12) := 0;
v_incval NUMBER(12) := 0;
BEGINIF INSERTING AND :new.id IS NULL THEN--如果插入的时候id为空,则查询序列号获取id值SELECT seq_student.NEXTVAL INTO v_newVal FROM DUAL;IF v_newVal = 1 THEN SELECT NVL(max(id),0) INTO v_newVal FROM student;v_newVal := v_newVal + 1;LOOP --防止表中主键大于序列号导致主键冲突,序列号大于等于表中最大id+1,则表示可以插入数据EXIT WHEN v_incval>=v_newVal;SELECT seq_student.nextval INTO v_incval FROM dual;END LOOP;END IF;:new.id := v_newVal;END IF;
END;
3、使用selectKey标签,可以通过序列号,或者直接查询id的最大值+1实现,插入之后可以返回主键id
1、通过序列号(需要创建一个为seq_student的序列号)
<insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.test.student" useGeneratedKeys="false" ><selectKey keyProperty="id" order="BEFORE" resultType="java.lang.Long">select seq_student.nextval from dual</selectKey>insert into student( id,name)values (#{id},#{name})</insert>
2、通过查询id的最大值+1实现
<insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.test.student" useGeneratedKeys="false" ><selectKey keyProperty="id" order="BEFORE" resultType="java.lang.Long">select nvl(max(id),0)+1 from student</selectKey>insert into student( id,name)values (#{id},#{name})</insert>
通过selectKey这种方式插入数据之后,可以返回student的id,比如
studentMapper.insert(Student student);
System.out.println(student.getId()); //此处可以获得本条插入数据的id值
4、自定义主键生成规则
比如无规则类型的uuid,有规则类型的时间戳,或者建立一个表专门用来存各种id的最大值,然后插入的时候每次去这个表中取最大值+1即可
Mybatis使用Oracle数据库主键自增相关推荐
- Oracle数据库主键自增
Oracle数据库主键自增 在学习mysql时,我们很容易通过auto_increment就能实现主键自增的功能,但是在Oracle数据库中,是没有这个关键字的,所以也不能通过这样来实现主键自增.下面 ...
- Navicat:设置Oracle数据库主键自增
一. 创建如下表 Oracle数据库不同于Mysql.Sql Server数据库,Oracle数据库主键自增不能在建表时直接设置,而是需要通过序列和触发器进行设置! 二.创建序列 create seq ...
- Oracle数据库主键自增的两种方式(SEQUENCE和触发器)
1.准备工作 创建oracle数据库表,用户表 SYS_USERS 其中user_id为主键 -- Create table create table SYS_USERS (user_id NUMBE ...
- oracle数据库主键自增序列_Oracle数据库主键自增
Oracle数据库主键自增 在学习mysql时,我们很容易通过auto_increment就能实现主键自增的功能,但是在Oracle数据库中,是没有这个关键字的,所以也不能通过这样来实现主键自增.下面 ...
- 数据库主键自增插入显示值
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/nwsuaf2009012882/article/details/32703597 SQL Serve ...
- mysql主键自增为什么在插入的时候还要自己写主键值_数据库主键自增插入显示值...
SQL Server 2008 数据库主键自增插入显示值 前几天在工作的时候遇到在删除数据库中表的数据的时候,删除之后,重新添加的数据没有得到原来的数据的id值(表中id为主键,且设置为自增) ,使用 ...
- 数据库主键自增到最大值
使用mysql数据库: 因为数据库主键增长到啦最大值,数据id达到了20亿,查询数据好像只有200万数据: int字段:数据的范围在-2^31~2^31-1 2^31-1 = 2147483647 u ...
- sequence解决oracle数据库主键不自增
工作这么多年.总算遇到一家数据库用oracle的企业了,由于oracle与mysql的不同,mysql设置了主键(id),那他就会实现自增,插入数据时,无需指定id的值,但是oracle却无法实现主键 ...
- mybatis 设置数据库主键自增
1.mapper.xml文件中: useGeneratedKeys="true" keyProperty="id" <insert id="sa ...
最新文章
- js 验证数据类型的4中方法
- HDU1402(高精度乘法)
- PHP+XML留言板
- 基于Salmon的转录组定量流程
- android 如何判断h5页面是否加载完成_H5 键盘兼容性小结
- LeetCode:Combinations
- 十年 | 我花了十年,才弄明白了Node.js
- linux驱动基础开发1——linux 设备驱动基本概念-转
- (转)LuaPlus C++ 函数互调
- 在html5中插入flash,如何将Flash嵌入到HTML5中?
- thinkphp6 task异步
- ubuntu18.04安装lua5.3.6和luarocks3.8
- 测试的阿萨德萨达阿萨德
- 辉芒FT60F011A-DRB单片机产品开发芯片解密IC程序编写烧录芯片
- 雨听|Mac使用“打印”将文件保存为本地PDF
- SpringBoot使用JRebel热部署
- 什么叫做POJO类?
- matlab expand 扩展 用不了,matlab中expand函数 Matlab 里的expand怎么用
- 群晖从windows迁移到esxi+直通踩坑历险记
- 怎样设计一个管理系统