日期:2014-05-20  浏览次数:20703 次

帮忙写一个oracle的id生成器!
没思路!所以请各位大神帮小弟写一个。
我重启程序后它生成的id应该不会冲突吧!

------解决方案--------------------
oracle 数据库没有像 MYSQL一样有 自动ID增值 的功能,如要实现可以用触发器。

首先就是建立一个序列,序列有有自动增值的功能,再建立一个触发器。

如:

建立一个序列

CREATE SEQUENCE auto_seq
 minvalue 1 -- 最小值
increment by 1 -- 每次增加值数
nocache -- 不启用缓存
nocycle -- 不循环;


建立一个触发器

CREATE OR REPLACE trigger auto_id_tri
 before insert on pjsh_person -- before 表示插入新数据时执行
for each row -- 每次插入数据到pjsh_person表时执行下面的oracle 语句
begin
 select auto_seq.nextval into :NEW.ID from dual;
 end;


auto_id_tri 触发器名

auto_seq.nextval 提取auto_seq 序列的值

:NEW.ID  ID为要添加的主键列名

pjsh_person 要添加自动ID值的表名。

------解决方案--------------------
....貌似我以前还写过类似的专利..
你可以自己用一个表来维护类似oracle序列的字段
新建序列表SEQUENCE
CREATE TABLE `SEQUENCE` (
  `name` varchar(45) NOT NULL COMMENT '
业务表名称(数据库_表名)',
  `value` bigint(20) NOT NULL COMMENT '
业务表对应的主键id',
  `increment` int(11) DEFAULT '1' COMMENT '
序列的步长,默认1,如果出现负值则表示序列按此步长递减',
  `start` bigint(20) DEFAULT '1' COMMENT '
用于定义序列的初始值,默认1',
  PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='序列表'
然后写一个工具类来维护和获取自增序列
或者自己写存储过程维护序列
------解决方案--------------------
ORACLE上没有自增字段,可以使用索引和触发器来达到此目的 
第一步:创建SEQUENCE 
CREATE   SEQUENCE   S_COUNTRY_ID   INCREMENT   BY   1   START   WITH   1   MAXVALUE   999999999; 
第二步:插入
SQL> INSERT INTO TTT VALUES (S_COUNTRY_ID.NEXTVAL,'DDD');
或者创建一个基于该表的BEFORE   INSERT   触发器,在触发器中使用该SEQUENCE 
create or replace trigger TRG_TEST before insert on 表名 for each ROW
BEGIN
 SELECT S_COUNTRY_ID.NEXTVAL INTO :NEW.U_ID FROM DUAL;
END;

------解决方案--------------------
查查create SEQUENCE的用法吧。。。
全库共享的自增id