Как поместить ограничения внешнего ключа на вычисляемые поля в SQL Server? - PullRequest
8 голосов
/ 31 марта 2010

В таблице A есть вычисляемое поле с именем Computed1. Это persisted и не ноль. Кроме того, он всегда вычисляется с выражением char (50). Он также уникален и имеет уникальное ключевое ограничение.

В таблице B есть поле RefersToComputed1, которое должно ссылаться на действительное значение Computed1.

Попытка создать ограничение внешнего ключа для B's 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 ]

7 голосов
/ 31 марта 2010

Вычисляемое поле состоит из char (M), char (N) и т. Д., Которые в сумме составляют M + N + .. = 50, но само вычисляемое поле - varchar (50). Изменение RefersToComputed1 на varchar (50) вместо char (50) решает проблему.

Внешние ключи вычисляемых полей не требуют специальной обработки (хотя для вычисляемого столбца может потребоваться сохранение).

1 голос
/ 31 марта 2010

Является ли RefersToComputed1 точно таким же типом данных, длиной и сопоставлением, что и Computed1?

Дважды проверьте его ... например, вам нужен финальный CAST или COLLATE для Computed1, чтобы сделатьуверен, что это то, что вы ожидаете?Я говорю это потому, что ошибка говорит о том, что 2 столбца разные

Правка: char и varchar не являются идентичными типами данных, поэтому вам потребуется CAST, чтобы изменить его

1 голос
/ 31 марта 2010

Является ли RefersToComputed1 первичным ключом типа char(50)?

...