[英]IDENTITY SEED is incrementing based on other tables seed values
該文檔非常具體地說明了identity
不能保證的內容:
列上的標識屬性不保證以下內容:
值的唯一性。 . .
事務中的連續值。 . .
服務器重新啟動或其他故障后的連續值。 . .
重用價值
一般來說,“唯一性”屬性不是問題,因為標識列通常是主鍵(或通常至少聲明為unique
性),這確實保證了唯一性。
identity
列的目的是提供一個不同於其他行的唯一數字標識符,因此它可以很容易地用作主鍵。 沒有其他保證。 並且為了性能 SQL 服務器有許多導致差距的捷徑。
如果您不希望有任何間隙,那么最簡單的方法是在查詢時分配一個值:
row_number() over (order by <identity column>)
這不是 100% 令人滿意,因為刪除會影響值。 我還認為在並行系統上,插入也可以(因為身份可能緩存在各個節點上)。
如果您不關心性能,則可以使用sequence
來分配值。 這比使用identity
的性能要差。 基本上,它需要序列化所有的插入來保證插入的屬性。
我應該注意,即使有一個序列,失敗的插入仍然會產生間隙,所以它仍然可能無法達到你想要的效果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.