delcare n_id number(10); beginSELECT SEQ_RESOURCE.NEXTVAL INTO N_ID FROM DUAL;insert table (id,..) values(n_id,..) end;
CREATE SEQUENCE a.SEQ_ID START WITH 1 INCREMENT BY 1 MAXVALUE 1E30 NOCYCLE NOCACHE;CREATE OR REPLACE TRIGGER a.TRIG_a_ID BEFORE INSERT ON a.a FOR EACH ROW BEGIN IF (:NEW.ID IS NULL) THEN SELECT SEQ_ID.NEXTVAL INTO :NEW.ID FROM DUAL; END IF; END; /
create sequence myid start with 1 increment by 1 maxvalue 9999999999 nocycle; insert into x value(myid.nextval);
先建立一个序列,然后通过触发器在insert时把序列值插入到表里 至于具体操作,前面高手都说了
我的方法不知道好不好仅供参考。 建立一个存储主键值的表,结构如下表名 字段名 主键当前值 tab1 col1 132 tab2 col2 2568每次往表里插值时,先去查询该表的主键当前值,插完值后再将当前值+1更新回去。 例如:tab1里记录的最大值是131,主键表里的值是132 insert into tab1 (col1) value (select 主键当前值 where 表名 = tab1 and 字段名 = col1); update 主键表 set 主键当前值 = 主键当前值+1 where 表名 = tab1 and 字段名 = col1;这种方法比序列便于管理对于表很多的情况来说,取主键值,和更新主键值可以做一个通用的方法,只需传入参数(表名,字段名)即可,这样使用起来更便捷
n_id number(10);
beginSELECT SEQ_RESOURCE.NEXTVAL INTO N_ID FROM DUAL;insert table (id,..)
values(n_id,..)
end;
CREATE SEQUENCE a.SEQ_ID START WITH 1 INCREMENT BY 1 MAXVALUE 1E30 NOCYCLE NOCACHE;CREATE OR REPLACE TRIGGER a.TRIG_a_ID
BEFORE INSERT ON a.a
FOR EACH ROW
BEGIN
IF (:NEW.ID IS NULL) THEN
SELECT SEQ_ID.NEXTVAL INTO :NEW.ID FROM DUAL;
END IF;
END;
/
insert into x value(myid.nextval);
至于具体操作,前面高手都说了
建立一个存储主键值的表,结构如下表名 字段名 主键当前值
tab1 col1 132
tab2 col2 2568每次往表里插值时,先去查询该表的主键当前值,插完值后再将当前值+1更新回去。
例如:tab1里记录的最大值是131,主键表里的值是132
insert into tab1 (col1) value (select 主键当前值 where 表名 = tab1 and 字段名 = col1);
update 主键表 set 主键当前值 = 主键当前值+1 where 表名 = tab1 and 字段名 = col1;这种方法比序列便于管理对于表很多的情况来说,取主键值,和更新主键值可以做一个通用的方法,只需传入参数(表名,字段名)即可,这样使用起来更便捷
因为.nextval只能去一次,如果不用,下次再取就+1了
解决办法:
取Max(ID)+1
create sequence id start with 1 increment by 1 maxvalue 9999999999 nocycle;
insert into xxx value(id.nextval);