我们知道在mysql中主键设置为int类型,然后设置AUTO_INCREMENT,则在插入数据的时候mapper中的sql文件是可以不写主键这个字段,数据库就会自动补全一个自增的主键值,但是在oracle中没有AUTO_INCREMENT这个设置方式,那么这个主键应该怎么实现呢?目前根据系统中常用的方式总结了一下,大致包括以下四种:
比如MAPPER中sql像下面这样
insert into student( id,name)values (seq_student.nextval,#{name,jdbcType=VARCHAR})
比如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;
select seq_student.nextval from dual insert into student( id,name)values (#{id},#{name})
select nvl(max(id),0)+1 from student insert into student( id,name)values (#{id},#{name})
通过selectKey这种方式插入数据之后,可以返回student的id,比如
studentMapper.insert(Student student);
System.out.println(student.getId()); //此处可以获得本条插入数据的id值
比如无规则类型的uuid,有规则类型的时间戳,或者建立一个表专门用来存各种id的最大值,然后插入的时候每次去这个表中取最大值+1即可