2017-07-26 43 views
1

我有如下表:SQL服務器:重置身份如果出現錯誤

create table testTable 
(
    id int identity primary key, 
    string varchar(256), 
    constraint testConstraint unique(string) 
) 

具有以下觸發:

create trigger testTrigger 
on testTable 
for delete as 
begin 
    declare @max_ int 
    select @max_= max(id) from testTable 

    if @max_ is null 
     set @max_ = 0 
     DBCC CHECKIDENT ('testTable', RESEED, @max_) 
end 

執行以下命令:

insert into testTable(string) values ('test') --identity = 1 
insert into testTable(string) values ('test') --error thrown because duplicate key but **identity = 2** 
insert into testTable(string) values ('test1') --due to erroneous identity increment identity = 3 

第一插入設置標識= 1,第二個由於唯一(字符串)約束而拋出錯誤,但是i牙齒錯誤設置爲2

問題是我該如何使錯誤不會增加身份?

是否有做,所有待所有SQL Server當該鑑別是基於什麼已經列/表以確保生產順序方式的功能?這樣所有的邊緣情況都會被捕獲。

在此先感謝(:

+1

我認爲你非常重視擁有完美的數據。身份差距是完全正常和預期的。它在每次插入嘗試時遞增,即通過設計。當一行被刪除時,間隙也會出現。如果您使用的是2012+,則可以使用序列,但在刪除某行時仍會有空白。 –

+0

感謝@SeanLange,你能提供一個關於如何創建這個序列的指導方針嗎?我對此沒有任何認識。 –

+0

https://www.google.com/search?q=sql+server+sequence&ie=utf-8&oe=utf-8 –

回答

0

不應該有任何需要,以防止在標識列的差距聽起來好像你可能會被應用業務邏輯來替代鑰匙,哪一種失敗的目的你。可以做一個序列肖恩·蘭格在評論中指出。

+1

這真的是一個評論,而不是一個答案。公平地說,這裏唯一有效的答案是「沒有辦法做你正在問的東西」。 :) –

+0

哈哈,事情是這是一個企業,所以我需要應用業務邏輯。 –

1

正如其他人所說,不擔心標識列差距從DELETE來臨了。

如果你確實需要,沒有增量數在它的空白處,你可以在需要的時候在SELECT端處理。

例如,請參閱ROW_NUMBER ...這可以與鏈接的時間戳列(類似於SYSUTCDATETIME)一起使用,以便在查詢中獲得行的確切添加順序ORDER DESCROW_NUMBER()

這將被綁定到數據,因爲如果行是DELETE d,這些ROW_NUMBERS 變化。