Oracle里面想实现自动插入递增的序号

insertintotable1(serialno,name)select'111'SerialNo,namefromtable2但是,SerialNo当然应该是递增的,... insert into table1(serialno,name) select '111' SerialNo,name from table2

但是,SerialNo当然应该是递增的,每次执行都从1开始
不想写匿名块
有这样的语法实现吗?
展开
 我来答
linzi2
2013-01-26 · TA获得超过1261个赞
知道大有可为答主
回答量:1563
采纳率:0%
帮助的人:539万
展开全部
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;
追问
谢谢你的回答。
不过我的表还是有这样的问题:
表是用四个字段作为联合主键,这个增长字段是主键之一。
这个字段的值不是每次都在基础上增加。
比如我 执行一次 insert into ... select 这个字段是从1开始insert递增的,比如说递增到100
但是我下次执行 这个语句的时候,不是从100 开始,而是又从1开始的。

由于字段不确定原因,后面的只能 用insert into 。。select 这种写法,不能使用游标进行循环。
btg1234931
推荐于2017-11-25
知道答主
回答量:4
采纳率:0%
帮助的人:4.7万
展开全部
使用ROWNUM 这样每次插入的时候都是根据行数来重新生成的这个值。
如果你想从1开始。那就INSERT INTO ... select ROWNUM AS ID.....
从2开始就 INSERT INTO ... select ROWNUM+1 AS ID.....
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
帐号已注销
2013-01-26 · TA获得超过153个赞
知道小有建树答主
回答量:378
采纳率:0%
帮助的人:125万
展开全部
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;

这个是俺们主管写的触发器 你试试看,我这儿就行
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式