首页 新闻 会员 周边

oracle,主键自增长,从序列取值,用触发器好or用java直接写个方法好?

0
悬赏园豆:15 [已解决问题] 解决于 2019-08-21 10:46

oracle,主键自增长,从序列取值,用触发器好or用java直接写个方法好?

lrj1596的主页 lrj1596 | 初学一级 | 园豆:22
提问于:2019-07-25 10:20
< >
分享
最佳答案
0

还是用触发器吧,类似下面这样:
create or replace
TRIGGER "GEW"."TRI_AUTHORITY"
BEFORE INSERT ON GEW_AUTHORITY
FOR EACH ROW
BEGIN
SELECT SEQ_AUTHORITY.NEXTVAL INTO :NEW.ID FROM DUAL;
END;
----------------------------
SEQ_AUTHORITY是序列;
最终选择触发器而非Java写个方法,是从性能和易维护性两个角度进行比较得出的结论:
1、性能更高,肯定的,不解释;
2、易维护性上讲,
有些人总是一刀切地认为数据库的机制,
肯定没有伟大的面向对象语言Java来得更易维护;
但是,
我认为这是,
人云亦云的说法,
死脑筋的想法,
不知变通的做法;
深入进去看,
触发器,主体逻辑就一句SQL语句——从序列取个值,
这难维护个毛啊~~~~~~~~~
so,易维护性同样没有下降;

lrj1596 | 初学一级 |园豆:22 | 2019-08-21 10:30
其他回答(2)
0

直接写个方法,触发器移植性不好,一般不用。现在一般就是在mybatis的xml中用sql跑序列做id

收获园豆:10
小言W | 园豆:179 (初学一级) | 2019-07-25 10:56

你的意思是,序列依然建立在数据库里面,然后mybatis里面写一个SQL语句,去数据库的序列里取nextval?

支持(0) 反对(0) lrj1596 | 园豆:22 (初学一级) | 2019-07-25 14:14

@lrj1596: 就是selectKey 的使用。你可以看看这个:
1.https://www.cnblogs.com/erma0-007/p/8616256.html
2.https://blog.csdn.net/nangeali/article/details/81278802

支持(0) 反对(0) 小言W | 园豆:179 (初学一级) | 2019-07-25 14:36

@小言W: 我不是问“立即返回最新插入记录的id的方法”;我是问,插入记录的时候,怎么生成被插入记录的id的方法............
如果不用UUID,也不是MySQL(我题目里面说了是用oracle的序列的方式),现在只差一步,从序列里取值,这个“取”的动作,是交给触发器好呢?or在java里面直接写个方法好呢?

支持(0) 反对(0) lrj1596 | 园豆:22 (初学一级) | 2019-07-25 14:56

@小言W: 哦!!!!sorry,sorry,我误解了你的意思,你这个方案确实是可以的,
但是,我是觉得实际项目中,一般不会出现中途改数据库的情况,也就是说,一般不会出现需要移植的情况,所以,移植性方面的因素,我个人是觉得不必考虑;肯定是项目启动时,就已经定好数据库用哪个了;
另外,持久层框架,我们也不一定用mybatis,这里就跟持久层框架的选择又扯上关系了;
再次,触发器只要写一次就行了,如果用selectKey方案,每个插入记录的地方,都要写一次selectKey逻辑,这个也有点重复的味道~~
所以,我最终还是选择用触发器。

支持(0) 反对(0) lrj1596 | 园豆:22 (初学一级) | 2019-08-21 10:56
0

这个mybaits增加
<insert id="insert">
<selectKey keyProperty="id" resultType="int" order="BEFORE">
select seq.nextval from dual
</selectKey>
insert into t_user values(#{id},#{name},#{age},#{salary})
</insert>

收获园豆:5
超级火锅 | 园豆:232 (菜鸟二级) | 2019-08-07 11:10

你这个方案确实是可以的,
但是,我是觉得实际项目中,一般不会出现中途改数据库的情况,也就是说,一般不会出现需要移植的情况,所以,移植性方面的因素,我个人是觉得不必考虑;肯定是项目启动时,就已经定好数据库用哪个了;
另外,持久层框架,我们也不一定用mybatis,这里就跟持久层框架的选择又扯上关系了;
再次,触发器只要写一次就行了,如果用selectKey方案,每个插入记录的地方,都要写一次selectKey逻辑,这个也有点重复的味道~~
所以,我最终还是选择用触发器。

支持(0) 反对(0) lrj1596 | 园豆:22 (初学一级) | 2019-08-21 10:57
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册