Mybatis使用Oracle数据库主键自增
创始人
2025-05-31 10:15:09

一、关于mysql和oracle主键自增        

        我们知道在mysql中主键设置为int类型,然后设置AUTO_INCREMENT,则在插入数据的时候mapper中的sql文件是可以不写主键这个字段,数据库就会自动补全一个自增的主键值,但是在oracle中没有AUTO_INCREMENT这个设置方式,那么这个主键应该怎么实现呢?目前根据系统中常用的方式总结了一下,大致包括以下四种:

1、使用序列号,插入sql中写入id字段,并且将值设置为序列号的下一个值(需要创建一个为seq_student的序列号)

比如MAPPER中sql像下面这样

   insert into student( id,name)values (seq_student.nextval,#{name,jdbcType=VARCHAR})

2、使用序列号,跟mybatis一样插入sql中不写id字段,然后创建一个插入数据的触发器(需要创建一个为seq_student的序列号和student_id_TRIG的触发器)

比如MAPPER中sql像下面这样

    insert into student( name)values (#{name,jdbcType=VARCHAR})

 创建触发器如下:

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的序列号)

  select seq_student.nextval from dualinsert into student( id,name)values (#{id},#{name})

 2、通过查询id的最大值+1实现

    select nvl(max(id),0)+1  from studentinsert into student( id,name)values (#{id},#{name})

通过selectKey这种方式插入数据之后,可以返回student的id,比如

studentMapper.insert(Student student);
System.out.println(student.getId()); //此处可以获得本条插入数据的id值

4、自定义主键生成规则

比如无规则类型的uuid,有规则类型的时间戳,或者建立一个表专门用来存各种id的最大值,然后插入的时候每次去这个表中取最大值+1即可

相关内容

热门资讯

今日重大通报“佛手在线到底有挂... 您好:佛手在线这款游戏可以开挂,确实是有挂的,需要了解加客服微信【69174242】很多玩家在佛手在...
三分钟了解“夜猫麻将!透视辅助... 您好:夜猫麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...
分享实测“牌乐门透视挂辅助下载... 您好:牌乐门这款游戏可以开挂,确实是有挂的,需要了解加客服微信【5902455】很多玩家在牌乐门这款...
重大通报“相约十三水究竟有挂吗... 您好:相约十三水这款游戏可以开挂,确实是有挂的,需要软件加微信【8487422】很多玩家在这款游戏中...
玩家实测“白金岛跑胡子有透视挂... 您好:白金岛跑胡子这款游戏可以开挂,确实是有挂的,需要了解加客服微信【4194432】很多玩家在白金...