2010-02-01 230 views
2

的我需要生成與 以下特性ID:自動生成ID

  1. ID必須是唯一的

  2. 標識由兩個部分「類型」和「自動遞增」號

  3. 「類型」是整數,值可以是1,2或3

  4. 「自動遞增」號開始與10001和每次增加id 生成。

  5. 類型是從Web窗體中選擇的,並且自動遞增的數字 來自數據庫。

示例:如果類型已選擇2和自動遞增數量是10001

然後將生成的ID是= 210001

可能有用戶生成的id hundrads。現在我的問題是, 這可以做到沒有存儲過程,以便沒有id的confict。

我使用ASP.Net(C#),甲骨文,NHibernate的

回答

3

當你使用Oracle,你可以使用一個Sequence

每次撥打電話your_sequence.NEXTVAL時,都會返回一個唯一的號碼。

0

如果您不能使用自動遞增類型(如序列),請創建一個包含每種類型並保留其當前值得分的表格。小心控制對此表的訪問並使用它來生成新的數字。儘管如此,它很可能會成爲你數據庫中的熱點。

1

什麼是在具有ID的第一個數字來定義類型的地步?您應該爲此使用單獨的列,然後僅爲實際標識使用簡單的自動遞增主鍵。

1

最簡潔的方法是 - 正如Scott Anderson所說 - 使用兩列。每個屬性應該是原子的,即只有一個含義。使用多值列時,必須應用函數(substr)來顯示例如類型。限制將更難以界定。沒有什麼比單純的「檢查(整數類型在(1,2,3))」或「檢查(ID> 10000)」中更勝一籌。

至於定義你的第二個屬性 - 姑且稱之爲「身份證」 - 從10001開始數,你有兩個不錯的策略:

1)使用一個序列,從1開始,並顯示使用表達式「10000 + row_number()over(按id整數分段排序)」,讓用戶看到他們想要的數字。

2)使用三個序列,每個integer_type一個序列,並讓它們具有10001的開始子句。

你應該明確使用序列的原因是可擴展性。如果您不使用序列,則必須將當前值存儲在某個表中,然後序列化對該表的訪問。這在多用戶系統中並不好。通過序列,您可以設置緩存屬性來減少幾乎所有的爭用問題。

希望這會有所幫助。

問候, 羅布。