2010-01-03 168 views
2

我需要爲2個或更多表定義並生成主鍵。使用自動增量自定義主鍵生成

表持有相同類型的數據,但對於某些業務規則,我們必須讓他們分開說喜歡

表A = LOCAL_CUSTOMERS
表B = INTERNATIONAL_CUSTOMERS

兩個持有類似,CUSTOMER_ID c_name和市同列。 ...等

在設計主鍵時,我希望這些鍵是 PREFIX和一個自動生成的數字的組合,因爲自動增量式int PK會這樣做。

例如,CUSTOMER_ID(PK)爲表 「LOCAL_CUSTOMERS」

LOC1,LOC2,LOC3,...... LOC5000

和CUSTOMER_ID(PK)爲表 「INTERNATIONAL_CUSTOMERS」

INT1,INT2,INT3,...... INT5000

LOC和INT是LOCAL,INTERNATIONAL的前綴。

我們可以使用int設置「身份規範」中的自動增量,但我該如何做到這一點? 是否需要爲列設置「計算列說明」?

謝謝

回答

1

你絕對可以用計算列來做到這一點。

要麼,如果你堅持你的兩個表,你可以只是簡單添加一個計算,堅持列如下:

ALTER TABLE Local_Customer 
    ADD CustomerID AS 'LOC' + CAST(ID AS VARCHAR(7)) PERSISTED 

ALTER TABLE International_Customer 
    ADD CustomerID AS 'INT' + CAST(ID AS VARCHAR(7)) PERSISTED 

如果你決定有一個discrimator列,例如單個表「IsDomestic」類型BIT的,你能做到這一點會用「LOC」或「INT」作爲前綴,基於「IsDomestic」列的值的單個計算列:

ALTER TABLE Customer 
    ADD CustomerID AS CASE IsDomestic WHEN 0 THEN 'INT' ELSE 'LOC' END + CAST(ID AS VARCHAR(7)) PERSISTED 

無論哪種方式 - 你的「對於每一行將自動增加INT IDENTITY類型的「ID」字段,並且計算列將自動創建一個更易於理解的「CustomerID」,而無需您做任何進一步的努力。

+0

感謝隊友瞭解問題並提供「解決方案」 – 2010-01-04 13:33:46

2

你可以在區域ID和自動ID上有複合鍵。

也可能有一個觸發器,在插入時將pk設置爲自定義字符串。

一般來說,最好將它們保留在同一個表格中(因爲它們具有相同的列),只有local和intl不同。

1

我想你應該儘可能將它們放在同一張表中,然後再添加一列來區分本地和國際客戶。使用2個表格,您將這些表格中將來需要做的所有工作翻倍。更不用說使用計算的varchar id值而不是簡單生成的long id。

1

你試圖實現的是被稱爲子類型:同類對象的特例。有幾種常見的方法來實現它:

  1. 使一個表包含這兩種類型所需的所有列。對那些不適用於所有類型的屬性使用NULLable列,對所有其他屬性使用強制列。只有一張桌子,所以只在PK上。
  2. 使用生成的pk爲所有常見屬性(基本類型)創建一個表。爲每個子類型添加單獨的表格。這些表有一個pk,它使用外鍵指向基類型的pk(因此與基類型有1:1的關係)。因此,這兩種類型的同一組鍵值

的繪製(有更多的方法,但這些是最有用的,和最流行的)

我會建議vehementlyu反對形形色色的「智能」鍵。當然,你可以在你的表中有一個「type」列(用於基本類型)來快速確定你正在處理的內容。但像你這樣的關鍵計劃只是讓事情變得複雜而沒有真正的價值。

2

如果你提出的2個表具有相同的列,那麼我看不出爲什麼你應該使它們成爲單獨的表。創建一個用於存儲客戶類型(國際或國內)的列並保持該方式。爲什麼使用2個表格就足夠了?

0

其他答案都有效。

我想補充一點,因爲看起來有一些人希望爲當地和國際客戶制定單獨的序列,所以依賴對任何特定的順序行爲是一個壞主意。特別是,對於身份列,如果插入失敗並且回滾(身份爲事務立即保留,但是如果約束或觸發器失敗,則永遠不會插入),則可能存在間隙。也可以更改種子和間距,也可以使用標識插入插入非連續值。

我會主張使用客戶類型標誌的真正的代理標識列。您的身份專欄在所有客戶中都是唯一的。如果你絕對想要單獨的序列,你可以寫一個觸發器來獲得一個真正的無間隔序列或使用身份。然後,您可以使用持久計算的列來建立組合鍵,並根據您的需要在該列上放置索引。