Возникли проблемы с созданием вычисляемого столбца в качестве первичного ключа, почти уверен, что это вопрос правильного использования сохраненного столбца [закрыто]

Я работаю над проектом базы данных, где у меня есть таблица с двумя значениями 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)

Очевидно, вам нужно отбросить любой существующий первичный ключ, чтобы эта команда работала.

Другие вопросы по тегам