我在Access中建立了一张表,其主键是自增字段,用delete from删除数据后,再新增一条时,发现其自增字段还是继续增加下去,没有从1开始,请问如何删除数据才能使自增字段从1开始自增

解决方案 »

  1.   

    没有用过access但
    主键是自增字段,我想比较难实现.在SQL SERVER里的做法是:CAEATE TABLE (ID INT,.. )添加数据时,用一个函数来获得最大ID,把(最大ID+1)设为ID的默认值.建一个删除的解发器.具体如下:--函数
    create function emp_getid()
    returns int
    as
    begin
    declare @id int
    select @id=max(id) from emp
    set @id=isnull(@id,0)+1
    return(@id)
    end--表
    CREATE TABLE [dbo].[emp] (
    [id] [int] NOT NULL ,
    a varchar(10)
    ) ON [PRIMARY]
    GOALTER TABLE [dbo].[emp] WITH NOCHECK ADD 
    CONSTRAINT [PK_emp] PRIMARY KEY  CLUSTERED 
    (
    [id]
    )  ON [PRIMARY] 
    GOALTER TABLE [dbo].[emp] WITH NOCHECK ADD 
    CONSTRAINT [DF__emp__id__208CD6FA] DEFAULT ([dbo].[emp_getid]()) FOR [id]
    GO
    --触发器
    create trigger emp_delete on dbo.emp
    AFTER delete
    as
    declare @id int,@mid int
    select @mid=min(id),@id=@mid-1 from deleted
    update emp set id=@id,@id=@id+1 where id>@mid--测试数据
    insert emp (a)
    select '10'
    union all select '20'
    union all select '30'delete emp where id =2select * from empdrop table emp
    drop function emp_getid/*
    id    a
    -----------
    1 10
    2 30*/
      

  2.   

    用Delete直接是没办法的,你若想从头开始就
    select * into tblb from tbla where 0 > 1
    drop table tbla
    select * into tbla from tblb
    drop table tblb
    来实现吧,在SQLServer中有一个truncate table tbla能实现,可惜不能用在Access中
    还有一个办法,就是你delete from table后把数据压缩一下也可以
      

  3.   

    你试一下能不能压缩:
    procedure TfrmPer.miCDataClick(Sender: TObject);
      procedure CompactAccess(sDBName: string; JetId: string = '4.0');   //压缩
      var
        AVariant: Variant;
      begin
        if FileExists(sDBName + '.tmp') then DeleteFile(sDBName + '.tmp');
        AVariant := CreateOleObject('JRO.JetEngine');
        AVariant.CompactDataBase('Provider=Microsoft.Jet.OLEDB.' + JetId + ';Jet OLEDB:DataBase Password=780927+790621;Data Source=' + sDBName ,
        'Provider=Microsoft.Jet.OLEDB.' + JetId + ';Jet OLEDB:DataBase Password=780927+790621;Data Source=' + sDBName + '.tmp');
        DeleteFile(sDBName);
        ReNameFile(sDBName + '.tmp', sDBName);
      end;
    var
      sDBName: string;
    begin
      if dmPer.acPer.Connected then dmPer.acPer.Close;
      Sleep(500);
      sDBName := ExtractFilePath(Application.ExeName) + 'permis.mdb';  {这里可以改成你数据库程序的路径}
      CompactAccess(sDBName);
      MessageBox(self.Handle, '数据库压缩成功!', '提示', mb_IconInformation + mb_Ok);
      dmPer.acPer.Open;
    end;