2009-05-08 70 views
1

我需要構建由3個部分組成的主鍵。在列中構建並顯示覆雜的組合主鍵

  • 第一部分是3個字母長 和必須是一個後跟兩個 數字例如「A00」
  • 第二部分是一個3位 唯一標識符包括前導 ZEROES,例如「003」
  • 第三部分是日期的年份部分 ,如「2008」

這一切分離與破折號,所以一個完整的關鍵看起來像「A00-0 14-2008"

我的解決辦法是將與每個數據的三個單獨的列,未格式化,然後添加聚集主鍵約束,當我需要在一個視圖中顯示它格式化。這是一個好方法嗎?我認爲可能有一種方法可以使用觸發器更新整個密鑰,但我不知道如何。另外,我將如何連接並在視圖中顯示它?

雖然不是一門功課的問題,這將有助於我的學業。

回答

3
CREATE TABLE mytable (
     first TINYINT NOT NULL CHECK(first BETWEEN 0 AND 99), 
     second INT NOT NULL CHECK (second BETWEEN 0 AND 999), 
     third INT NOT NULL, 
     CONSTRAINT pk_mytable_123 PRIMARY KEY (first, second, third) 
    ) 
GO 
CREATE VIEW v_mytable AS 
SELECT 'a' + RIGHT('00' + CAST(first AS VARCHAR), 2) AS first, 
     RIGHT('0000' + CAST(second AS VARCHAR), 4) AS second, 
     third 
FROM mytable 
GO 

INSERT 
INTO mytable 
VALUES (1, 1, 2008) 
GO 

SELECT * 
FROM v_mytable 
GO 

first second third 
---- ---- ---- 
a01 0001 2008 

這個主鍵只能容納INT值,所有格式將在視圖中進行。

注意,才達到最好的結果在性能方面,你更好地創造,而不是視圖計算列,並創建一個額外的UNIQUE指數在這些列:

CREATE TABLE mytable (
     _first TINYINT NOT NULL CHECK(_first BETWEEN 0 AND 99), 
     _second INT NOT NULL CHECK (_second BETWEEN 0 AND 999), 
     third INT NOT NULL, 
     first AS 'a' + RIGHT('00' + CAST(_first AS VARCHAR), 2), 
     second AS RIGHT('0000' + CAST(_second AS VARCHAR), 4) 
     CONSTRAINT pk_mytable_123 PRIMARY KEY (_first, _second, third) 
    ) 

CREATE UNIQUE INDEX ux_mytable_123 ON mytable (first, second, third) 
+0

第二個應該是3個字符長(001而不是0001)並且可能將組合添加到視圖中,這似乎是他正在尋找的?又名「a01-001-2008」 – Andomar 2009-05-08 11:14:02

+0

似乎他想加入這些價值觀從外部世界得到的東西。在這種情況下,最好有3列。連接比分析更容易。 – Quassnoi 2009-05-08 11:15:45

+0

當測試第二個表時,我收到錯誤,唯一性拼寫錯誤,然後它抱怨語法錯誤,然後它說「表'mytable2'中的計算列'第二'不允許在另一個計算列定義中使用。 「 – Tarks 2009-05-08 11:24:23

5

我的問題是:自己做任何這三個數值沒有意義?或者它們只是主鍵的組成部分?如果他們完全沒有其他的意思,那麼你最好只用整個價值創造一個單一的列。

現在「意義」可能很難取得資格。這可能意味着它是一個特定的客戶代碼或搜索的東西,或者很多東西。

一般來說,我儘量避免組合鍵,因爲它們複雜的連接,通常會讓你的生活困難的ORM(通常觀看這樣的做法 - 無論對錯 - 作爲「遺產」)。

如果這些領域確實有那麼意味着可以說,他們不應該是主鍵的一部分。我認爲這種做法是mistake。我幾乎總是使用自動編號列或序列作爲主鍵值(稱爲「技術鍵」而不是語義鍵)。

鑑於用戶提供了這部分內容,需要對其進行格式化,所以我假定該密鑰具有整體的含義,無論是產品代碼,患者代碼,預訂號碼還是其他類似內容。這是正確的嗎?

如果是這樣,因爲我的技術要點(意見在這個問題上有所不同),我會考慮不使這個主鍵幾乎完全偏好。爲此創建一個自動編號字段。只需使用varchar(12)或其他任何唯一索引作爲acolumn。

+0

+1。尼斯答案 – 2009-05-08 11:03:19

+0

確實很好,謝謝^ _ ^如果我理解你的意思含義,那麼不,他們都是爲了唯一識別一個記錄。我將如何去產生這個?第一部分必須由用戶輸入,另外兩部分由編程生成。 – Tarks 2009-05-08 11:08:53

+0

是的,我很抱歉沒有正確的框架問題,整個關鍵在於識別一名員工。我很樂意將Occam的剃鬚刀加入此項,並使用自動遞增標識列或主鍵,但需要指明這是與舊系統連接所需的。 – Tarks 2009-05-08 11:22:36

0

主鍵,通常有兩個目的:唯一標識一行,並允許其他數據庫表引用它。複合主鍵完成第一個目的,但是第二個目標很難完成,因爲其他表必須引用3列。 ORM系統也是如此,甚至可以從網頁進行更新。

最佳實踐解決方案是將標識列作爲主鍵。這可以方便地引用該行,並且是所有ORM圖層都可以處理的情景。然後,在組成主鍵的三列上添加一個「唯一」索引。這樣你就擁有了兩全其美的優點。