一、关于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数据库主键自增相关推荐

  1. Oracle数据库主键自增

    Oracle数据库主键自增 在学习mysql时,我们很容易通过auto_increment就能实现主键自增的功能,但是在Oracle数据库中,是没有这个关键字的,所以也不能通过这样来实现主键自增.下面 ...

  2. Navicat:设置Oracle数据库主键自增

    一. 创建如下表 Oracle数据库不同于Mysql.Sql Server数据库,Oracle数据库主键自增不能在建表时直接设置,而是需要通过序列和触发器进行设置! 二.创建序列 create seq ...

  3. Oracle数据库主键自增的两种方式(SEQUENCE和触发器)

    1.准备工作 创建oracle数据库表,用户表 SYS_USERS 其中user_id为主键 -- Create table create table SYS_USERS (user_id NUMBE ...

  4. oracle数据库主键自增序列_Oracle数据库主键自增

    Oracle数据库主键自增 在学习mysql时,我们很容易通过auto_increment就能实现主键自增的功能,但是在Oracle数据库中,是没有这个关键字的,所以也不能通过这样来实现主键自增.下面 ...

  5. 数据库主键自增插入显示值

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/nwsuaf2009012882/article/details/32703597 SQL Serve ...

  6. mysql主键自增为什么在插入的时候还要自己写主键值_数据库主键自增插入显示值...

    SQL Server 2008 数据库主键自增插入显示值 前几天在工作的时候遇到在删除数据库中表的数据的时候,删除之后,重新添加的数据没有得到原来的数据的id值(表中id为主键,且设置为自增) ,使用 ...

  7. 数据库主键自增到最大值

    使用mysql数据库: 因为数据库主键增长到啦最大值,数据id达到了20亿,查询数据好像只有200万数据: int字段:数据的范围在-2^31~2^31-1 2^31-1 = 2147483647 u ...

  8. sequence解决oracle数据库主键不自增

    工作这么多年.总算遇到一家数据库用oracle的企业了,由于oracle与mysql的不同,mysql设置了主键(id),那他就会实现自增,插入数据时,无需指定id的值,但是oracle却无法实现主键 ...

  9. mybatis 设置数据库主键自增

    1.mapper.xml文件中: useGeneratedKeys="true" keyProperty="id" <insert id="sa ...

最新文章

  1. js 验证数据类型的4中方法
  2. HDU1402(高精度乘法)
  3. PHP+XML留言板
  4. 基于Salmon的转录组定量流程
  5. android 如何判断h5页面是否加载完成_H5 键盘兼容性小结
  6. LeetCode:Combinations
  7. 十年 | 我花了十年,才弄明白了Node.js
  8. linux驱动基础开发1——linux 设备驱动基本概念-转
  9. (转)LuaPlus C++ 函数互调
  10. 在html5中插入flash,如何将Flash嵌入到HTML5中?
  11. thinkphp6 task异步
  12. ubuntu18.04安装lua5.3.6和luarocks3.8
  13. 测试的阿萨德萨达阿萨德
  14. 辉芒FT60F011A-DRB单片机产品开发芯片解密IC程序编写烧录芯片
  15. 雨听|Mac使用“打印”将文件保存为本地PDF
  16. SpringBoot使用JRebel热部署
  17. 什么叫做POJO类?
  18. matlab expand 扩展 用不了,matlab中expand函数 Matlab 里的expand怎么用
  19. 群晖从windows迁移到esxi+直通踩坑历险记
  20. 怎样设计一个管理系统

热门文章

  1. 惠普 ENVY 16 创意本 评测
  2. count(*)和count(distinct *)
  3. SIP:408、503错误
  4. 未来充电桩市场将迎来八大发展趋势
  5. linux 终端 浏览器_如何使用W3M从Linux终端浏览
  6. react history路由跳转
  7. 谈谈Android中的HandlerThread
  8. 人民日报:高考英语结束了,但李华还没有长大
  9. windwos 下载Windows 版 iCloud - Apple 支持
  10. 小程序服务器换肤,微信小程序实现换肤功能