實現在刪除資料後,自增列的值連續

2021-08-30 18:55:18 字數 3489 閱讀 5169

無意間放入發現,覺得很有用,先記錄下來

實現在刪除資料後,自增列的值連續其處理思路如下:

在刪除自增列所在表的記錄時,將刪除行的自增列的值儲存在另外乙個表,以便下次新增資料時,使用原來被刪除的自增列的值。

實現步驟:

建立兩個表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]

gocreate table [dbo].[test_id] (

[id] [int] identity (1, 1) not null ,

[name] [varchar] (20) collate chinese_prc_ci_as null

) on [primary]

goif exists (select * from dbo.sysobjects where id = object_id(n'[dbo].[test_r]') and objectproperty(id, n'isusertable') = 1)

drop table [dbo].[test_r]

gocreate 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

asbegin

declare @row int

set @row=0

if exists(select * from deleted )

begin

insert into test_r(r_id) select id from deleted

endend

向表test_id插入資料時,判斷其id是否存在與test_r表中,如存在則刪除id在test_r值,通過test_id的插入觸發器實現:

create trigger it_test_id on [dbo].[test_id]

for insert

asbegin

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 )

endend

在插入前需判斷test_r表是否存在被刪除的id ,若存在,則使用其test_r表中的記錄作為插入行id欄位的值

如沒有,則直接插入。通過test_id表的插入前觸發器實現:

create trigger iit_test_id on test_id

instead of insert

asbegin

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

endinsert into test_id(id,name)values(@min_id,@name)

fetch cur_get into @id,@name

endclose 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'

enddrop table #t

endelse

-- 不存在斷號就直接插入。

insert into test_id(name )select name from inserted

end

oracle刪除資料後的恢復

要達到刪除資料,有以下幾種方式都可以 1 delete 2 drop乙個表 3 truncate乙個表 重要的不是怎麼刪除乙個表,而是誤刪除資料後怎麼立即恢復 不考慮全庫備份和利用歸檔 日誌 對於delete方法,可以利用oracle提供的閃回方法 如果在刪除資料後還沒做大量的操作 只要保證被刪除資...

oracle刪除資料後的恢復

要達到刪除資料,有以下幾種方式都可以 a 確定刪除資料的時間 在刪除資料之前的時間就行,不過最好是刪除資料的時間點 b 用以下語句找出刪除的資料 select from 表名 as of timestamp to timestamp 刪除時間點 yyyy mm dd hh24 mi ss c 把刪除...

重置MySQL中表中自增列的初始值的實現方法

重置mysql中表中自增列的初始值的實現方法 1.問題的提出 在mysql的資料庫設計中,一般都會設計自增的數字列,用作業務無關的主鍵。在資料庫出現頻繁的刪除操作或者清空操作之後,其自增的值仍然會自動增長,如果需要重新開始該如何做呢?2.解決辦法 a.alter table delete from ...