Oracle的自增字段如果设计

Chiff 2003-03-05 06:19:12
因为对Oracle不熟,第一次用。但有需要为某表的某个字段设为自动增长。

如:

create table mytable(autoid number,itemid char(10));

如何使insert into mytable(itemid) values('a')插入的记录autoid字段自动在最大值基础上加一。

注意事项
一、不允许使用create sequence的方法。
二、要考虑到一次性插入多条记录的情况。比方:
insert into mytable(itemid) select itemid from mytable;
三、效率比较重要。

请大家帮帮我
...全文
45 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Chiff 2003-03-07
  • 打赏
  • 举报
回复
结合大力提供的第二种方法,用一个笨办法暂时解决了:

新建一个流水号表,在触发器里面,每次insert的时候,在每条被insert记录触发前从流水号表得到流水号并赋给被插入记录,然后update流水号表将流水号加一,如此循环。

这样的话,如果insert into table(b) select b from table;有一千条记录,就得1000次select流水号表和1000次update流水号表。

我想应该还有我不知道的更好的办法。此帖过两天结。
Chiff 2003-03-06
  • 打赏
  • 举报
回复
playyuer说的对。

不过,至少在mssql里还能用游标来处理,或者插入到临时表。

在oracle里就不知道怎样做好了。
playyuer 2003-03-06
  • 打赏
  • 举报
回复
insert into mytable(itemid)
select itemid from mytable

这个在 SQL Server 里 Trigger 也不能实现!
Chiff 2003-03-06
  • 打赏
  • 举报
回复
当一条insert语句插入多条记录的时候,不知道应该怎么办。
Chiff 2003-03-06
  • 打赏
  • 举报
回复
序列的方法试了,是可以的。触发器的方法,却怎么也不行:(
pengdali 2003-03-05
  • 打赏
  • 举报
回复
create or replace trigger trdemo
before insert on t_name ln number for each row;
begin
select max(id) into ln from t_name;
new.id=ln+1;
end;
pengdali 2003-03-05
  • 打赏
  • 举报
回复
1.先创建序列

USERID 用户序列号
--
CREATE SEQUENCE USERID INCREMENT BY 1 START WITH 1
MAXVALUE 1.0E28 MINVALUE 1 NOCYCLE
NOCACHE NOORDER

2.创建触发器

USERADD 会员触发器
--
CREATE OR REPLACE TRIGGER USERADD
BEFORE INSERT ON MEMBERRG
FOR EACH ROW
BEGIN
USERID.NEXTVAL INTO :NEW.NUM FROM DUAL;
END;
pengdali 2003-03-05
  • 打赏
  • 举报
回复
Oracle上没有自增字段,可以使用索引和触发器来达到此目的
第一步:创建SEQUENCE
create sequence s_country_id increment by 1 start with 1 maxvalue 999999999;
第二步:创建一个基于该表的before insert 触发器,在触发器中使用该SEQUENCE
create or replace trigger bef_ins_t_country_define
before insert on t_country_define
referencing old as old new as new for each row
begin
new.country_id=s_country_id.nextval;
end;
Chiff 2003-03-05
  • 打赏
  • 举报
回复
今天要走了,请大家帮帮我。硬是不行,就只好在mssql里面建个identity的中间表了。

:)
Chiff 2003-03-05
  • 打赏
  • 举报
回复
不能建序列。

现在的问题是,我的mssql系统要与对方的Oracle系统做一个接口,人家不允许我建序列:(

这个东西要是放在mssql里实现,也实现得了,可是我不想那么做,因为会降低mssql服务器的效率。
Chiff 2003-03-05
  • 打赏
  • 举报
回复
呵呵,black_snail(●龙飞虎○) 如果你有时间麻烦帮我把这个Oracle语句写出来,多谢多谢!

:)
feelingrun 2003-03-05
  • 打赏
  • 举报
回复
oracle里建立一个序列,跟表挂钩就可以了
black_snail 2003-03-05
  • 打赏
  • 举报
回复
触发器的语法也是PL/SQL,和function , store procedure 是一样的.所以



WHILE <condition>
LOOP
<executable statement(s)>
END LOOP;
Chiff 2003-03-05
  • 打赏
  • 举报
回复
请问black_snail(●龙飞虎○)
触发器的while是如何实现的?
black_snail 2003-03-05
  • 打赏
  • 举报
回复
Oracle Or SQL SErver

anyway , it's not so difficult .

create table seq_ta ( seq number)
insert into seq_ta values ( 0)

create a trigger on mytable , while insert
select seq into variable from seq_ta
:new.autoid = variable + 1
update seq_ta set seq = seq + 1
总之,用trigger很容易完成

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧