SQL Server 2017 добавить новый столбец со значением по умолчанию из другого столбца в той же таблице

#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
  

Надеюсь, это поможет.