我需要這個的原因是我在我的桌子上創建了一個名爲display_order的列,現在它是smallint並且數字是預先確定的。是否有任何可編輯的Auto-Increment besdies IDENTITY?
但是,當我用我的軟件插入新記錄時,我不知道如何獲得該列中的最高數字並添加1,因此我想過如果更改8時自動遞增列的可能性到9它會相應地改變一切。
這可能嗎?
我需要這個的原因是我在我的桌子上創建了一個名爲display_order的列,現在它是smallint並且數字是預先確定的。是否有任何可編輯的Auto-Increment besdies IDENTITY?
但是,當我用我的軟件插入新記錄時,我不知道如何獲得該列中的最高數字並添加1,因此我想過如果更改8時自動遞增列的可能性到9它會相應地改變一切。
這可能嗎?
然而,當我插入一個新的紀錄,我的軟件,我不知道如何獲得該列中的最高數加1,
Insert MyTable(display_order, ....)
Select (
Select Max(display_order) + 1
From MyTable As T1
), ...
From MyTable
然而,我不會推薦這個。如果display_order是用戶可設置的,那麼我會簡單地假設相對值。因此,它不會如果用戶添加了display_order兩個值= 0。如果你真的想多走一英里,並提供重新排序的display_order的能力沒關係,你可以做到這一點,像這樣:
Update MyTable
Set display_order = Z.NewSeq
From (
Select PKCol
, Row_Number() Over (Order By display_order) As NewSeq
From MyTable
) As Z
Join MyTable As T
On T.PKCol = Z.PKCol
回答你的問題是「否」 IDENTITY
是唯一的自動遞增的能力(以及這些列不能更新)
但如果這是一個display_order
場你就不能讓它float
讓你在其他項目之間插入項目而不是將所有其他項目向下移動以創建間隙?
因爲每個表只能得到一個IDENTITY
列,所以我可能會使用觸發器或其他機制(如果存在集中式插入存儲過程)將其默認爲比表中最高數字多一個(如果未提供)。這避免了必須SET IDENTITY_INSERT
或類似的東西。
讓我看看我是否理解你的問題。你希望你的主鍵在所有情況下自動遞增,除非它不應該自動遞增? – 2011-04-08 22:01:30
爲什麼不能簡單地將列切換爲標識列? – 2011-04-08 22:05:43
嗯,因爲標識列不可編輯?至少有沒有簡單的方法來編輯它,通過MSSQL有一種方法,但通過代碼可能更難以實現結果。 – 2011-04-08 22:08:04