無意間放入發現,覺得很有用,先記錄下來
實現在刪除資料後,自增列的值連續其處理思路如下:
在刪除自增列所在表的記錄時,將刪除行的自增列的值儲存在另外乙個表,以便下次新增資料時,使用原來被刪除的自增列的值。
實現步驟:
建立兩個表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 ...