Oracle里面想实现自动插入递增的序号
insertintotable1(serialno,name)select'111'SerialNo,namefromtable2但是,SerialNo当然应该是递增的,...
insert into table1(serialno,name) select '111' SerialNo,name from table2
但是,SerialNo当然应该是递增的,每次执行都从1开始
不想写匿名块
有这样的语法实现吗? 展开
但是,SerialNo当然应该是递增的,每次执行都从1开始
不想写匿名块
有这样的语法实现吗? 展开
3个回答
展开全部
Oracle中不向其它数据库一样,有自动增长型数据类型,但可以变通处理
数据表信息为 Test(TID,TNAME),需要把TID设置为自动增值型字段,TID一般是int型
首先 新建一个序列AUTOID,以后其它表或触发器也可调用:
起始为1 增值为1 顺序增值
CREATE SEQUENCE AUTOID
INCREMENT BY 1
START WITH 1
NOMAXVALUE
NOCYCLE
CACHE 10;
然后建立触发器代码如下:
Test表 TID字段 AUTOID序列 不要更改DUAL临时表名
CREATE TRIGGER TRG_AutoID BEFORE
INSERT ON TEST
FOR EACH ROW begin
SELECT AUTOID.NEXTVAL
INTO :NEW.TID
FROM DUAL;
End TRG_AutoID;
最后SQL测试 insert into Test(tname) values('abc');
当然也可以采用 insert into Test(TID,tname) values(AUTOID.nextval,'libin');
在选择Select时,注意有两对:
AUTOID.currval 表示当前行的ID值
AUTOID.nextval 表示当前行的ID+1值
例:SELECT empseq.currval FROM DUAL;
数据表信息为 Test(TID,TNAME),需要把TID设置为自动增值型字段,TID一般是int型
首先 新建一个序列AUTOID,以后其它表或触发器也可调用:
起始为1 增值为1 顺序增值
CREATE SEQUENCE AUTOID
INCREMENT BY 1
START WITH 1
NOMAXVALUE
NOCYCLE
CACHE 10;
然后建立触发器代码如下:
Test表 TID字段 AUTOID序列 不要更改DUAL临时表名
CREATE TRIGGER TRG_AutoID BEFORE
INSERT ON TEST
FOR EACH ROW begin
SELECT AUTOID.NEXTVAL
INTO :NEW.TID
FROM DUAL;
End TRG_AutoID;
最后SQL测试 insert into Test(tname) values('abc');
当然也可以采用 insert into Test(TID,tname) values(AUTOID.nextval,'libin');
在选择Select时,注意有两对:
AUTOID.currval 表示当前行的ID值
AUTOID.nextval 表示当前行的ID+1值
例:SELECT empseq.currval FROM DUAL;
追问
谢谢你的回答。
不过我的表还是有这样的问题:
表是用四个字段作为联合主键,这个增长字段是主键之一。
这个字段的值不是每次都在基础上增加。
比如我 执行一次 insert into ... select 这个字段是从1开始insert递增的,比如说递增到100
但是我下次执行 这个语句的时候,不是从100 开始,而是又从1开始的。
由于字段不确定原因,后面的只能 用insert into 。。select 这种写法,不能使用游标进行循环。
展开全部
使用ROWNUM 这样每次插入的时候都是根据行数来重新生成的这个值。
如果你想从1开始。那就INSERT INTO ... select ROWNUM AS ID.....
从2开始就 INSERT INTO ... select ROWNUM+1 AS ID.....
如果你想从1开始。那就INSERT INTO ... select ROWNUM AS ID.....
从2开始就 INSERT INTO ... select ROWNUM+1 AS ID.....
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
CREATE OR REPLACE TRIGGER pa_TRG
BEFORE INSERT OR UPDATE OF 自增列
ON 表名
FOR EACH ROW
BEGIN
IF INSERTING THEN
SELECT 序列.NEXTVAL INTO :NEW.自增列 FROM DUAL;
ELSE
RAISE_APPLICATION_ERROR(-20020, '不允许更新ID值!');
END IF;
END;
这个是俺们主管写的触发器 你试试看,我这儿就行
BEFORE INSERT OR UPDATE OF 自增列
ON 表名
FOR EACH ROW
BEGIN
IF INSERTING THEN
SELECT 序列.NEXTVAL INTO :NEW.自增列 FROM DUAL;
ELSE
RAISE_APPLICATION_ERROR(-20020, '不允许更新ID值!');
END IF;
END;
这个是俺们主管写的触发器 你试试看,我这儿就行
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询