请问:
主键是标识列,如果删了一行后,以后有插入,主键仍然是连续的怎么办?谢谢。

解决方案 »

  1.   

    '标识列例子,不自动重排编号,而是自动补号'--创建得到最大id的函数
    if object_id('[f_getid]') is not null drop function f_getid
    go
    create function f_getid()
    returns int
    as
    begin
    declare @id int
    if not exists(select 1 from tb where id='001')
        set @id=1
    else
    begin
        select @id=max(id) from tb
        if @id is null
            set @id=1
        else
        begin
            declare @id1 int
            select @id1=min(id) from tb a where id<>@id and not exists(select 1 from tb where id=a.id+1)
            if @id1 is not null set @id=@id1
            set @id=@id+1
        end
    end
    lb_re:
    return @id
    end
    go--创建表
    if object_id('test.dbo.tb') is not null drop table tb
    go
    create table tb(id int primary key default dbo.f_getid(),name varchar(10))
    go
    --插入记录测试
    insert into tb(name) values('张三')
    insert into tb(name) values('张四')
    insert into tb(name) values('张五')
    insert into tb(name) values('张六')
    insert into tb(name) values('张七')
    insert into tb(name) values('张八')
    insert into tb(name) values('张九')
    insert into tb(name) values('张十')--显示插入的结果
    select * from tb
    /*
    id          name
    ----------- ----------
    1           张三
    2           张四
    3           张五
    4           张六
    5           张七
    6           张八
    7           张九
    8           张十(8 行受影响)*/
    --删除部分记录
    delete from tb where name in('张三','张七','张八','张十')--显示删除后的结果
    select * from tb
    /*
    id          name
    ----------- ----------
    2           张四
    3           张五
    4           张六
    7           张九(4 行受影响)*/
    --再次插入记录
    insert into tb(name) values('李一')
    insert into tb(name) values('李二')--显示插入的结果
    select * from tb order by id
    /*
    id          name
    ----------- ----------
    1           李一
    2           张四
    3           张五
    4           张六
    5           李二
    7           张九(6 行受影响)
    */--删除环境
    drop table tb
    drop function f_getid
      

  2.   

    happycell188:如果是标识列呢?
    您这个不是
      

  3.   


    使用DBCC CHECKIDENT 命令DBCC CHECKIDENT ('table_name', NORESEED) --不重置当前标识值。DBCC CHECKIDENT 返回一个报表,它--指明当前标识值和应有的标识值。 
    DBCC CHECKIDENT ('table_name') --或
    DBCC CHECKIDENT ('table_name', RESEED) --如果表的当前标识值小于列中存储的最大标识值,则使用标--识列中的最大值对其进行重置。 
    DBCC CHECKIDENT ('table_name', RESEED, new_reseed_value) --当前值设置为 new_reseed_value。如----果自创建表后没有将行插入该表,则在执行 DBCC CHECKIDENT 后插入的第一行将使用 new_reseed_value --作为标识。否则,下一个插入的行将使用 new_reseed_value + 1。如果 new_reseed_value 的值小于标--识列中的最大值,以后引用该表时将产生 2627 号错误信息。