获取自增字段值的问题

buyaowen 2008-11-17 05:12:29
请问oracle的自增字段是怎么实现的?尤其是我会删除其中的一些记录的时候,我用select max(id) from tablename; 是否可以获得。我担心的是如果我删除一些字段,比如删除的一条现在值是最大的,插入一条新的记录后,新的记录的自增字段是值与刚删除的值相同。

另外其它的数据库oracle是否有差别,目前要实现对多数据库的支持,起码要考虑oracle,sqlserver,mysql和db2.
...全文
313 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
dafei3020 2008-11-17
  • 打赏
  • 举报
回复
我个人喜欢建立一个table,专门存储号码,然后select ..for update..
范佩西_11 2008-11-17
  • 打赏
  • 举报
回复
sequence加触发器啊。

create table a(id int ,name varchar2(10));
create sequence seq; ----序列
create or replace trigger tr
before insert on a
for each row
begin
select seq.nextval into :new.a from dual;
end; ----触发器
SQL> insert into a (b) values ('zhangs');

1 row inserted

SQL> insert into a (b) values ('lisi');

1 row inserted

SQL> insert into a (b) values ('fgggs');

1 row inserted

SQL> insert into a (b) values ('wangwun');

1 row inserted

SQL> select * from a;

A B
--------------------------------------- ----------
1 zhangs
2 lisi
3 fgggs
4 wangwun

SQL> delete from a where a=(select max(a) from a);

1 row deleted

SQL> insert into a(b) values('nhhh');

1 row inserted

SQL> select * from a;

A B
--------------------------------------- ----------
1 zhangs
2 lisi
3 fgggs
5 nhhh
BlueskyWide 2008-11-17
  • 打赏
  • 举报
回复
create table tabid(id0 number(10));

create or replace procedure p_insert_id(tbl in varchar2,int1 int,int2 int) as
begin
For i in int1..int2
Loop
insert into tabid values(i);
End loop;
commit;
end;

--插入记录时:
insert into tableA(id) as select min(id0) from tabid;
--其它的字段可以以update tableA的方式来做。这样的话可以用于oracle,sqlserver,mysql和db2。
DragonBill 2008-11-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 buyaowen 的帖子:]
请问oracle的自增字段是怎么实现的?尤其是我会删除其中的一些记录的时候,我用select max(id) from tablename; 是否可以获得。我担心的是如果我删除一些字段,比如删除的一条现在值是最大的,插入一条新的记录后,新的记录的自增字段是值与刚删除的值相同。

另外其它的数据库oracle是否有差别,目前要实现对多数据库的支持,起码要考虑oracle,sqlserver,mysql和db2.
[/Quote]

既然要考虑到多数据库平台, 那就建一个序列表吧, 然后再SELECT...FOR UPDATE.
这种做法在Tom的那本Ora编程艺术中有介绍, 建议LZ参考一下
gisinfo 2008-11-17
  • 打赏
  • 举报
回复
有冲突

为什么一定要设置递增呢???

icss_zhen 2008-11-17
  • 打赏
  • 举报
回复
oracle中用sequence就可以了
Andy__Huang 2008-11-17
  • 打赏
  • 举报
回复
我认为楼主处理数据这种思路不好,一条记录已经使用过这个ID号,删除后,为什么还要重新使用这个ID号?
当然你一定要这样做也可以,就只能用select max(id) ... from tb ,获取最ID的办法

oracle里面有创建系列
-- 序列号的产生
create sequence auto_id
minvalue 1
maxvalue 999999999999
start with 1
increment by 1

由这个系列何以获得最新的ID
auto.nextval 下一个ID
auto.currentval 当前ID
sleepzzzzz 2008-11-17
  • 打赏
  • 举报
回复
不同的数据库对自增长的实现是不一样的.
例如oracle使用sequence, sqlserver则是在create table时指定字段属性identity


双子涂鸦 2008-11-17
  • 打赏
  • 举报
回复
当然,select max()肯定是愚蠢的,
两个人同时操作,你不是要犯傻了
双子涂鸦 2008-11-17
  • 打赏
  • 举报
回复
oracle 的自增序号是独立的,自己创建一个就行了
插入前将nextval记下来,然后该怎么做就怎么做了
sqlserver,mysql都是自增字段,需要在操作之后取 SELECT LAST_INSERT_ID()
db2没用过,不清楚
vc555 2008-11-17
  • 打赏
  • 举报
回复
OPER@jf> create table test(aaa number);

Table created.

OPER@jf> create sequence seq_1 start with 1 nocache;

Sequence created.

OPER@jf> insert into test values(seq_1.nextval);

1 row created.

OPER@jf> /

1 row created.

OPER@jf> /

1 row created.

OPER@jf> commit;

Commit complete.

OPER@jf> select * from test;

AAA
----------
1
2
3

OPER@jf> delete from test where aaa=3;

1 row deleted.

OPER@jf> commit;

Commit complete.

OPER@jf> insert into test values(seq_1.nextval);

1 row created.

OPER@jf> commit;

Commit complete.

OPER@jf> select * from test;

AAA
----------
1
2
4

OPER@jf>


内容概要:本文详细介绍了 MySQL 中 AUTO_INCREMENT 属性的使用方法,这是一种用于模拟序列行为的方式。它允许在表中创建自增字段,通常作为主键,确保每行数据都有唯一的标识符。文中提供了创建带有自增字段的表的示例,解释了插入数据时如何自动分配自增,并介绍了如何使用 LAST_INSERT_ID() 函数获取最近插入行的自增。还说明了如何查看表的当前自增以及注意事项,如删除行后自增不会被重用。此外,文章展示了在 PERL 和 PHP 中获取自增的方法,并讨论了重置序列和设置序列开始的具体操作。; 适合人群:对 MySQL 数据库有一定了解的数据库管理员或开发人员,尤其是那些需要理解和使用自增字段进行数据管理的人群。; 使用场景及目标:① 学习如何在 MySQL 中创建具有自增字段的数据表;② 掌握插入数据时不指定自增字段的情况下,数据库如何自动分配唯一标识符;③ 了解如何在不同编程语言中获取最近插入行的自增;④ 掌握重置序列和设置序列开始的方法。; 其他说明:AUTO_INCREMENT 属性只能应用于整数类型的字段,并且在实际应用中应谨慎处理自增字段的重置,以免造成数据混乱。同时,在设置自增时要注意避免唯一性冲突。

17,382

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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