oracle插入数据时自增ID的解决思路

一直在用MySQL,从来没有为自增ID发过愁,这初到oracle上,连自增ID都让我挠头,好在互联网资源丰富,我在充分吸取精华后,把我的一点经验总结出来给大家分享分享…

 

1.
创建一个sequence,命名建议和表名相关,这样每个有插入需求的表都有一个sequence,让他们毫无相关,便于管理,比如我的表名为twitter,那么我的sequence名字为twitter_id_seq,这当然不是什么规则,只是我的习惯而已.
也有人说用一个公共的sequence就可以了,按个人习惯吧,我觉得这样方便些…
一些数据量不大的数据,我也建议他们可以共用一个sequence,这样避免创建太多sequence
create sequence twitter_id_seq increment by 1 start with 1

2.
这样其实已经可以正常插入数据了,像这样:

INSERT INTO twitter
(“ID”,”CONTENT”,”AUTHOR”,”DATE”,”IMG”)
VALUES
(twitter_id_seq.nextval,’这是我发布在oracle上的第一条twitter!!!’,’1′,’1414042692′,”);

每次插入都要把ID字段列出来,这对于我这个用习惯了MySQL的人来说,简直太煎熬了,我之前从来都不写id字段的!于是有了下面的方法,借助触发器:

create or replace
trigger twitter before insert on emlog_twitter for each row
begin
select twitter_id_seq.nextval into :new.id from dual;
end;

这下好了,和MySQL的操作习惯终于一样了,sql如下:

INSERT INTO twitter
(“CONTENT”,”AUTHOR”,”DATE”,”IMG”)
VALUES
(‘这是我发布在oracle上的第一条twitter!!!’,’1′,’1414042692′,”);

3.
又有一个衍生的问题,如何得到上一次插入的id呢?
MySQL中有一个很好的函数LAST_INSERT_ID(),PHP中也有一个很好的函数mysql_insert_id(),还好sequence有一个特性currval,我们就利用它了,
执行sql语句 select TWITTER_ID_SEQ.currval from dual 得到当前currval的值,就是上一次插入的id.