7

表A有一個名爲Computed1的計算字段。它是persisted而不是null。另外,它總是計算一個表達式,即char(50)。它也是獨一無二的,它有一個獨特的關鍵約束。如何將外鍵約束放在sql server中的計算字段上?

表B有一個字段RefersToComputed1,它應該引用一個有效的Computed1值。

試圖創建B的RefersToComputed1引用了」 Computed1導致以下錯誤外鍵約束:

Error SQL01268: .Net SqlClient Data Provider: Msg 1753, Level 16, State 0, Line 1 Column 
'B.RefersToComputed1' is not the same length or scale as referencing column 'A.Computed1' in 
foreign key 'FK_B_A'. Columns participating in a foreign key relationship must be defined with 
the same length and scale. 

問:爲什麼這個錯誤產生的?計算列的外鍵是否需要特殊措施?如果是的話,它們是什麼?


總結:

  • 的具體問題從計算機,基於焦炭,場是VARCHAR上升。因此,Computed1是varchar(50)而不是char(50)。
  • 最好是圍繞計算字段的表達式強制轉換爲特定類型。對於這個技巧,Cade Roux感謝信。

回答

6

計算的字段由char(M),char(N)等組成,合計爲M + N + .. = 50,但計算的字段本身是varchar(50)。將RefersToComputed1更改爲varchar(50)而不是char(50)可解決問題。

計算字段外鍵不需要特殊處理(儘管可能需要在計算列上保留)。

+0

好catch-CHAR(50)將被填充爲50個字符長度的空格,而VARCHAR將不會是另一個加上使用VARCHAR而不是CHAR來處理這些事情! – 2010-03-30 21:29:06

+2

需要持久化才能將其索引,這將需要在其上創建FK ... – gbn 2010-03-30 21:32:21

+0

您還可以在計算列表達式中進行強制轉換,以確保持久化列的類型與您認爲的類型相同。這是字符串操作中的一個大問題。 – 2010-03-30 22:16:51

1

RefersToComputed1char(50)類型的主鍵?

+0

@Lucero:這不是一個主鍵。這種關係是多對一的,所以在表B中可以有幾個具有相同值的RefersToComputed1。 – 2010-03-30 21:20:45

+0

那麼你究竟想要做什麼?一個外鍵約束被用來確保列只有一個引用主鍵的條目,但在你的情況下沒有主鍵。請解釋。 – Lucero 2010-03-30 21:23:55

+2

你也可以*用一個外鍵引用一個唯一的索引 - 不一定非要PK。 – 2010-03-30 21:28:02

1

RefersToComputed1完全一樣的數據類型,長度和排序規則與Computed1完全相同嗎?

仔細檢查一下......例如,您是否需要最終的CAST或COLLATE Computed1以確保它符合您的期望?我這樣說是因爲錯誤是說,兩列不同

編輯:CHAR和VARCHAR是不相同的數據類型,所以你需要一個CAST改變它