2011-06-28 123 views
3

SQL Server 2008+TSQL自動增量更新

我有一個自動增量列的表,我想增加不僅在插入而且更新。此列不是主鍵,但也有一個主鍵,它是通過newid()自動創建的GUID。

據我所知,有兩種方法可以做到這一點。

1.)刪除現有的行,並插入一個新的行與indentical值(加上任何更新)。

2)更新現有行並使用以下方法來獲得「下一個」身份值:

IDENT_CURRENT('myTable') + IDENT_INCR('myTable') 

在任何情況下,我被迫允許身份插入。 (使用選項1,因爲表的主鍵需要保持不變,並使用選項2,因爲我正在使用特定值更新自動增量列。)我不確定鎖定/性能的後果這是。

對此有何看法?有更好的方法嗎?這裏的目標是每當插入或更新行時在列中保持一組不斷增加的整數值。

+0

儘管您可以「獲取」特定表格的下一個Identity值,但通常不會幫助您,除了測試該值。尤其是,您無法將現有行的標識值更新爲應該是「下一個」的標識值。您可以設法使用應用程序邏輯來序列化一個主鍵,但如果連續值由於性能命中而絕對需要,我只會這樣做。如果感興趣,我會在我的答案中添加一些內容。 – hardmath

回答

4

我認爲rowversion (formerly known as "timestamp")類型的列可能是您最簡單的選擇,儘管在8字節這些可能相當大的整數。 「timestamp」語法不贊成使用rowversion(因爲ISO SQL有時間戳數據類型)。

如果您仍然使用Identity列方法,那麼您可能希望將您的邏輯放入UPDATE觸發器,該觸發器將有效地用您所描述的INSERT和DELETE組合替代UPDATE。

請注意,標識列值不保證是順序的,只會增加。

+0

我已經研究過這個,但我不確定它在表格中保證是唯一的,並且始終遞增。 (不要在意順序,只要它總是增量。) 從您的描述來看,它不僅在表格中是唯一的,而且在整個數據庫中也是如此。正確? – RMD

+0

這是一個很好的問題,數據庫內的唯一性。我不得不依賴微軟的文檔,「rowversion」是一種數據類型,它公開自動生成的數據庫中唯一的二進制數字...... rowversion數據類型只是一個遞增的數字。「 – hardmath

2

它需要是一個整數列嗎?時間戳列將爲您提供開箱即用的功能。

2

具有標識屬性的列無法更新。一旦具有身份屬性的列被自動分配或賦值爲identity_insert,它就是一個不變的值。此外,身份財產不得通過alter column被禁用或刪除。

我相信你想看的是SQL Server TIMESTAMP(現在在SQL Server 2008中稱爲rowversion)。它基本上是一個自動遞增的二進制值。每個數據庫都有一個唯一的rowversion計數器。每行在具有時間戳/行轉換列的表中插入/更新會導致計數器被勾起,並將新值分配給插入/修改的行。