且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何把外键约束在SQL Server中的计算字段?

更新时间:2023-01-21 08:47:02

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

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


Table A has a computed field called Computed1. It's persisted and not null. Also, it always computes to an expression which is char(50). It's also unique and has a unique key constraint on it.

Table B has a field RefersToComputed1, which should refer to a valid Computed1 value.

Trying to create a foreign key constraint on B's RefersToComputed1 that references A' Computed1 leads to the following error:

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.

Q: Why is this error created? Are there special measures needed for foreign keys for computed columns, and if so what are they?


Summary:

  • The specific problem rises from computed, char based, fields being varchar. Hence, Computed1 is varchar(50) and not char(50).
  • It's best to have a cast surrounding a computed field's expression to force it to a specific type. Credit goes to Cade Roux for this tip.

The computed field is composed of char(M), char(N) and so on, that add up to M+N+.. = 50, but the computed field itself is varchar(50). Changing RefersToComputed1 to varchar(50) instead of char(50) solves the problem.

Computed fields foreign keys require no special treatment (although persisted might be required on the computed column).