7

Таблица A имеет вычисленное поле под названием Computed1. Это persisted, а не null. Кроме того, он всегда вычисляет выражение, которое является char (50). Он также уникален и имеет уникальное ключевое ограничение.Как установить ограничения внешнего ключа для вычисленных полей в sql-сервере?

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

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

Q: Почему создается эта ошибка? Существуют ли специальные меры для внешних ключей для вычисленных столбцов, и если да, то каковы они?


Резюме:

  • Конкретная проблема поднимается из вычислен, символ на основе, поля является VARCHAR. Следовательно, Computed1 является varchar (50), а не char (50).
  • Лучше всего, чтобы литье окружало выражение вычисленного поля, чтобы заставить его использовать определенный тип. Кредит отправляется в Cade Roux для этого наконечника. KG

ответ

6

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

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

+0

good catch - CHAR (50) будет дополняться длиной 50 символов пробелами, а VARCHAR не будет - еще одним плюсом для использования VARCHAR над CHAR для таких вещей! –

+2

Персистировать нужно было бы проиндексировать его, что потребовалось бы для создания FK на нем ... – gbn

+0

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

1

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

+0

@Lucero: Это не первичный ключ. Отношение много к одному, поэтому в таблице B может быть несколько RefersToComputed1 того же значения. –

+0

Итак, что именно вы пытаетесь сделать? ограничение внешнего ключа используется, чтобы убедиться, что столбец содержит только записи из ссылочного первичного ключа, но в вашем случае нет первичного ключа. Пожалуйста, объясни. – Lucero

+2

вы можете * также * ссылку уникальный индекс с внешним ключом - не обязательно должны быть ПК. –

1

Есть RefersToComputed1 точно такой же тип данных, длина и сортировка точно так же, как Computed1?

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

Edit: голец и VARCHAR не являются одинаковыми типами данных, так что вы будете нуждаться в CAST, чтобы изменить его