Возникли проблемы с созданием вычисляемого столбца в качестве первичного ключа, почти уверен, что это вопрос правильного использования сохраненного столбца [закрыто]
Я работаю над проектом базы данных, где у меня есть таблица с двумя значениями int, я хочу создать вычисляемый столбец, в котором два значения представлены как varchars и объединены с пробелом. Затем я захотел использовать этот столбец в качестве первичного ключа. НО, по-видимому, вычисляемый столбец не был уникальным и разрешал нули (что я не понимаю, поскольку разрешенные нули для всей таблицы не проверялись), поэтому он не позволил мне.
Немного погуглив, я обнаружил, что мне не разрешено изменять вычисляемый столбец, поэтому мне пришлось отбросить столбец и переделать его. Я обнаружил, что мне нужно преобразовать вычисляемый столбец как постоянный, чтобы использовать его в качестве ключа, но, пытаясь создать новый вычисляемый столбец, он просто ненавидит ключевое слово Persisted, и я не уверен, почему.
Может ли кто-нибудь сказать мне, что я делаю неправильно, или даже если я создаю этот столбец таким образом, я смогу использовать его в качестве первичного ключа?
ALTER TABLE CardData
ADD CardID AS (CAST (CardSet AS varchar) + ' ' + (CAST (CardNumber AS varchar)) PERSISTED;
3 ответа
Почему вы хотите определить строковое представление двух столбцов в качестве первичного ключа?
Просто используйте составной первичный ключ:
alter table carddata add primary key (cardset, cardnumber);
Чтобы это работало, два столбца должны быть определены как
not null
.
Вы все еще можете определить вычисляемый столбец. Просто нет необходимости использовать его в качестве первичного ключа.
ALTER TABLE CardDataADD CardID AS(CAST (CardSet AS varchar(10)) + '' + CAST(CardNumber AS varchar(10))) PERSISTED NOT NULL PRIMARY KEY
РАБОТАЛ! Спасибо, парни!
У вас может быть составной ПЕРВИЧНЫЙ КЛЮЧ, основанный на двух физических значениях столбца, помимо того факта, что они являются частью вычисляемого столбца или нет.
Что-то вроде:
ALTER TABLE CardData
ADD CONSTRAINT PK_CardData_Composite PRIMARY KEY (CardSet, CardNumber)
Очевидно, вам нужно отбросить любой существующий первичный ключ, чтобы эта команда работала.