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即可

相关内容

热门资讯

重大发现{情怀信阳为什么一直输... 重大发现{情怀信阳为什么一直输}√曝光开挂猫腻您好:情怀信阳这款游戏可以开挂,确实是有挂的,需要了解...
「科技热点」“乐翻娱乐有挂吗 ... 您好:乐翻娱乐这款游戏可以开挂,确实是有挂的,需要了解加客服微信【2278274】很多玩家在这款游戏...
(今日了解!)丫丫老陕麻将到底... 亲.丫丫老陕麻将这款游戏是可以开挂的,确实是有挂的,通过添加客服【3045033】很多玩家在这款游戏...
实测建议| 方片十三水 到底要... 有 亲,根据资深记者爆料方片十三水是可以开挂的,确实有挂(咨询软件无需打...
今日重大通报“新牛魔王透视挂辅... 您好:新牛魔王这款游戏可以开挂,确实是有挂的,需要软件加微信【4194432】,很多玩家在新牛魔王这...