实现在删除数据后,自增列的值连续

无意间放入发现,觉得很有用,先记录下来

 

实现在删除数据后,自增列的值连续其处理思路如下:

在删除自增列所在表的记录时,将删除行的自增列的值保存在另外一个表,以便下次新增数据时,使用原来被删除的自增列的值。

实现步骤:

创建两个表test_id(自增列所在表),test_r(记录被删除的自增列其值)

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[test_id]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[test_id]
GO

CREATE TABLE [dbo].[test_id] (
 [id] [int] IDENTITY (1, 1) NOT NULL ,
 [name] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[test_r]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[test_r]
GO

CREATE TABLE [dbo].[test_r] (
 [r_id] [int] NULL
) ON [PRIMARY]
GO

 在删除test_id 的记录时,将起响应id保存到test_r表,通过test_id 表的delete触发器实现

CREATE TRIGGER dt_test_id ON [dbo].[test_id]
FOR  DELETE
AS
begin
 declare @row int
 set @row=0
 if exists(select * from deleted )
  begin
   insert into test_r(r_id) select id from deleted
  end
 
end

 向表test_id插入数据时,判断其id是否存在与test_r表中,如存在则删除id在test_r值,通过test_id的插入触发器实现:

CREATE TRIGGER it_test_id ON [dbo].[test_id]
FOR INSERT
AS
begin
 if @@rowcount=0 return
 declare @row int
 set @row=0
 if exists(select * from inserted )
  begin
   delete from test_r where  exists(select id from inserted where  test_r.r_id=inserted.id )
  end
 
 end
 

在插入前需判断test_r表是否存在被删除的id ,若存在,则使用其test_r表中的记录作为插入行id栏位的值

如没有,则直接插入。通过test_id表的插入前触发器实现:

 

 
CREATE trigger iit_test_id on test_id
instead of insert
as
begin
declare @min_id int
declare @id int
declare @rowcount int
declare @rowcount_i int
declare @name varchar(20)
declare @sql varchar(8000)
create table #t(id int identity(1,1) ,name varchar(20) null,tag varchar(1) null)
insert into #t(name,tag) select name,'0' from inserted
--如果存在断号,取已经存在的断号。
if exists(select  * from test_r)
  begin
   -- 可以显示插入自增列。
   SET IDENTITY_INSERT test_id on
   --获取可用断号记录
   select @rowcount=count(*) from test_r
   --获取插入行的记录。
   select @rowcount_i=count(*) from inserted
   --当断号记录的数量大于插入数据的行数时,则所有的插入记录的 id均使用断号,故返回inserted 表中的所有行
   --当断号记录的数量小于插入数据的行数时,则所有的插入记录前的(断号记录总行数)行id均使用断号,故返回inserted 表中前(断号记录总行数)的行
   if @rowcount > @rowcount_i
    set @rowcount=@rowcount_i
   
   set @sql=''
   set @sql='declare cur_get cursor     for select top '+cast(@rowcount as varchar(20))+'  id,name from #t order by id '
    
   exec(@sql)
   open cur_get
   fetch cur_get into @id, @name
   while @@fetch_status=0
    begin
        
              select @min_id =min(r_id) from test_r
     if exists(  select min(r_id) from test_r)
      begin
              update #t set tag='1' where id=@id
      end
              insert into test_id(id,name)values(@min_id,@name)
     
              fetch cur_get into @id,@name
    end
   close cur_get
   deallocate cur_Get
   
   SET IDENTITY_INSERT test_id off

   --当断号记录的数量小于插入数据的行数时,使用断号记录的剩余行则不需要显示id插入
   if exists(select * from #t where tag='0')
    begin
     insert into test_id(name) select name from #t where  tag='0'
    end
   drop table #t
  end
 else
  -- 不存在断号就直接插入。
  insert into test_id(name )select name from inserted

 
end
 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Django,当删除数据后,id字段并不会自动重新自增删除数据只是将该记录从数据删除,并不会影响自增id的。因此,如果你删除了某些数据,再插入新的数据时,新数据的id将会继续自增,而不会填补之前删除数据的id空缺。这可能导致id出现断层的情况。\[2\] 如果你希望在删除数据后重新自增id,可以考虑以下几种方法: 1. 手动重置自增id:可以通过执行数据库的原生SQL语句来手动重置自增id。具体的方法可以根据你使用的数据库类型来确定,例如在MySQL可以使用`ALTER TABLE table_name AUTO_INCREMENT = 1`来重置自增id。 2. 使用Django的`reset_pk_sequence`方法:在Django,你可以使用`reset_pk_sequence`方法来重置自增id。这个方法会根据当前表的最大id来重新设置自增id的起始。具体的使用方法可以参考Django官方文档的说明。 3. 使用第三方库:还有一些第三方库可以帮助你实现自增id的重置,例如`django-sequence-field`库可以提供更灵活的自增id管理功能。 总之,删除数据自增id不会自动重新填补空缺,如果你需要重新自增id,可以考虑使用上述方法来实现。\[2\] #### 引用[.reference_title] - *1* [django models里数据表插入数据id自增操作](https://blog.csdn.net/weixin_30609645/article/details/115955139)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [mysql数据自增id,删除数据后id不连续,出现断层](https://blog.csdn.net/qq_44650734/article/details/118691599)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [django自定义非主键自增字段类型详解(auto increment field)](https://blog.csdn.net/weixin_28909601/article/details/112844485)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值