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

相关内容

热门资讯

合作37年后彩星玩具与“忍者龟... 彩星玩具对“忍者龟”的特许权协议自2027年起将不获续期。12月23日,香港玩具企业彩星玩具(008...
“亨通光电”即将腾飞? 周末梳理电力产业链,以及提到了各环节的一些公司,有一家公司是这两天问我最多的,那就是亨通光电,这还让...
“并不是我们辞退了人家”,长城... 对于魏牌不断换“帅”一事,长城汽车董事长魏建军首次公开回应。12月22日,魏建军在与媒体交流时针对魏...
美元创八年来最差年度表现!专家... 2025年,美元经历了一场“滑铁卢”。衡量美元对一篮子主要货币汇率的美元指数,在年内暴跌约9%,正迈...
8连板胜通能源:公司不涉及机器... 新京报贝壳财经讯 12月23日,胜通能源公告,公司股票自12月12日以来连续8个交易日涨停,累计涨幅...