#sql-server-2017
#sql-server-2017
Вопрос:
У меня есть простой столбец with Weight1
, который имеет тип float
and not null
. Я хочу добавить новый столбец Weight2
со значением по умолчанию из Weight1
, поэтому оба Weight1
и Weight2
будут одинаковыми.
Кто-нибудь может помочь, как это сделать?
Я попробовал следующее:
IF EXISTS
(
SELECT 1
FROM sys.tables
WHERE Object_ID = OBJECT_ID(N'[dbo].[TableA]')
) AND NOT EXISTS
(
SELECT 1
FROM sys.columns
WHERE Name = N'Weight2' AND
Object_ID = OBJECT_ID(N'[dbo].[TableA]')
)
BEGIN
PRINT 'Adding Weight2 to [dbo].[TableA]';
ALTER TABLE [dbo].[TableA]
ADD [Weight2] FLOAT NOT NULL
END
Ошибка, которую я получаю,:
ALTER TABLE позволяет добавлять только столбцы, которые могут содержать значения null или иметь указанное определение по УМОЛЧАНИЮ, или добавляемый столбец является столбцом идентификатора или метки времени, или, альтернативно, если ни одно из предыдущих условий не выполняется, таблица должна быть пустой, чтобы разрешить добавление этого столбца.
Столбец ‘Weight2’ не может быть добавлен в непустую таблицу ‘TableA’, поскольку он не удовлетворяет этим условиям.
Спасибо
Ответ №1:
Ошибка ясно говорит вам: если вы добавляете столбец with NOT NULL
в таблицу, в которой уже есть данные, вы ДОЛЖНЫ включить DEFAULT
предложение для определения значений по умолчанию для вновь добавленного столбца — вы этого не делаете….
Итак, попробуйте это:
ALTER TABLE [dbo].[TableA]
ADD [Weight2] FLOAT NOT NULL
CONSTRAINT DF_TableA_Weight2 DEFAULT(0);
а затем вы можете обновить Weight2
, чтобы получить те же значения, что и в Weight1
:
UPDATE dbo.TableA
SET Weight2 = Weight1
Ответ №2:
Вы можете добавить столбец и сделать его вычисляемым столбцом, который получает значение из Weight1:
ALTER TABLE [TableA] ADD [Weight2] AS ([Weight1]) PERSISTED
Надеюсь, это поможет.