如何将外键约束放在sql server中的计算字段上?

时间:2010-03-30 21:14:16

标签: sql-server tsql sql-server-2008 foreign-keys calculated-columns

表A有一个名为Computed1的计算字段。它是persisted而不是null。此外,它总是计算一个char(50)的表达式。它也是独一无二的,并且有一个独特的键约束。

表B有一个字段RefersToComputed1,它应引用有效的Computed1值。

尝试在B的RefersToComputed1上创建引用A'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的这一提示。

3 个答案:

答案 0 :(得分:7)

计算字段由char(M),char(N)等组成,加起来为M + N + .. = 50,但计算字段本身为varchar(50)。将RefersToComputed1更改为varchar(50)而不是char(50)可以解决问题。

计算字段外键不需要特殊处理(尽管计算列上可能需要持久化)。

答案 1 :(得分:1)

RefersToComputed1char(50)类型的主键吗?

答案 2 :(得分:1)

RefersToComputed1Computed1完全相同的数据类型,长度和归类是什么?

仔细检查...例如,您是否需要Computed1上的最终CAST或COLLATE以确保它符合您的期望?我这样说是因为错误是说2列是不同的

编辑:char和varchar不是相同的数据类型,所以你需要一个CAST来改变它