/****** Object:  Table [dbo].[ttt]    Script Date: 2008-12-15 17:11:25 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ttt]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[ttt]
GO/****** Object:  Table [dbo].[ttt]    Script Date: 2008-12-15 17:11:26 ******/
CREATE TABLE [dbo].[ttt] (
    [id] [int] IDENTITY (1, 1) NOT NULL ,
    [name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [time] [datetime] NULL 
) ON [PRIMARY]
GOALTER TABLE [dbo].[ttt] ADD 
    CONSTRAINT [PK_ttt] PRIMARY KEY  CLUSTERED 
    (
        [id]
    )  ON [PRIMARY] 
GOinsert into ttt(name,time) values('logan',getdate());
insert into ttt(name,time) values('peter',getdate());
insert into ttt(name,time) values('man',getdate());
insert into ttt(name,time) values('lida',getdate());select * from ttt
delete from ttt where name='peter'
insert into ttt(name,time) values('peter',getdate());
select * from ttt结果(一)如下:
1    logan    2008-12-15 17:14:02.840
2    peter    2008-12-15 17:14:02.840
3    man    2008-12-15 17:14:02.840
4    lida    2008-12-15 17:14:02.857结果(二)如下:
1    logan    2008-12-15 17:14:02.840
3    man    2008-12-15 17:14:02.840
4    lida    2008-12-15 17:14:02.857
5    peter    2008-12-15 17:14:02.857
为什么结果(二)里面的name为peter的id值不是2而是5呢?有没有办法将自增列delete之后的id值给收回呢,这样delete之后再insert的话,name为peter的记录的id任然为2呢?

解决方案 »

  1.   

    IDENTITY 是sql server里面的语法,在oracle里面没有IDENTITY关键字,
    但是它用序列产生,但是这个系列同样不能再使用曾经使用的ID号
      

  2.   

    这杂都是SQL SERVER里的语法呢?
    getdate()~汗~
      

  3.   

    是啊,楼上的都回答了ORACLE里没有自增列的,要么用序列实现,要么用MAX(ID)来实现
      

  4.   

    顶二楼的   要想连续就用 rownum  
      

  5.   

    不能用rownum。
    不能跳号的用max,允许跳号用序列。
      

  6.   


    呵呵,估计楼主是在sql里面碰到类似的问题,然后想oracle里面这样的问题该如何解决呢?所以就发到这个板块了吧!
      

  7.   

    我觉的max也不行吧,因为lz删的是序号为2的,但删的时候序号最大值已经到4了,所以产生下一条记录的时候max就是4,加1的话还是5啊,
      

  8.   

    LZ要的效果靠系统自带的东东是搞不定的,不管是sql server还是oracle...identity和sequence的存在只是为了保证这条记录的唯一性....如果非要这种效果,只能自已写函数.
      

  9.   

    找个表记录使用的号段(估计楼主应该是开发类似发票这类不能跳号的东东)
    假设记录号段的表为A,取号之前,在A中查询是否有某些号尚未使用,(开始事务)如果存在则直接取出需要的号(注意对记录加锁,避免并发操作导致取出同一个号),使用取出的号码插入/更新具体业务表,成功后,对原A表中加锁的记录解锁,并更新A表,并提交事务;如果插入/更新业务表失败,则同样解锁