Как добавить столбец в таблицу SQL Server со значением по умолчанию, равным значению существующего столбца?
Я пробовал этот оператор T-SQL:
ALTER TABLE tablename
ADD newcolumn type NOT NULL DEFAULT (oldcolumn)
но это дает ошибку:
Имя "oldcolumn" в этом контексте недопустимо. Допустимые выражения - это константы, константные выражения и (в некоторых контекстах) переменные. Имена столбцов не разрешены.
sql
sql-server-2008
dodos
источник
источник
UPDATE
Боюсь, вам придется делать это отдельно .Ответы:
Попробуй это:
ALTER TABLE tablename ADD newcolumn type NOT NULL DEFAULT (0) Go Update tablename SET newcolumn = oldcolumn Where newcolumn = 0 Go
источник
Мне они не очень нравятся, но вот как это можно сделать с помощью
AFTER INSERT
триггера:CREATE TRIGGER TableX_AfterInsert_TRG ON TableX AFTER INSERT AS UPDATE TableX AS t SET t.newcolumn = t.oldcolumn FROM Inserted AS i WHERE t.PK = i.PK ; -- where PK is the PRIMARY KEY of the table
источник
AFTER INSERT
Триггер подход включает в себя накладные расходы из - за дополнительноеUPDATE
заявление. Я предлагаю использоватьINSTEAD OF INSERT
триггер следующим образом:CREATE TRIGGER tablename_on_insert ON tablename INSTEAD OF INSERT AS INSERT INTO tablename (oldcolumn, newcolumn) SELECT oldcolumn, ISNULL(newcolumn, oldcolumn) FROM inserted
Однако это не работает, если
oldcolumn
это столбец автоматической идентификации.источник
INSTEAD OF
триггеры также не работают при использовании темпоральных таблиц:SYSTEM_VERSIONING = ON
Чтобы расширить ответ Капила и избежать нежелательного ограничения по умолчанию, попробуйте следующее:
ALTER TABLE tablename ADD newcolumn type NOT NULL CONSTRAINT DF_TMP_TABLENAME_NEWCOLUMN DEFAULT -9999 Go Update tablename SET newcolumn = oldcolumn Go ALTER TABLE tablename DROP CONSTRAINT DF_TMP_TABLENAME_NEWCOLUMN Go
Замените -9999 на noData, если ваш тип - varchar, nvarchar, datetime, ... или любые совместимые данные для других типов: конкретное значение не имеет значения, оно будет стерто второй инструкцией.
источник
Вы можете использовать вычисляемый столбец для вставки нового столбца в таблицу на основе существующего значения столбца
ALTER TABLE dbo.TableName ADD NewColumn AS (OldColumn) PERSISTED;
ИЛИ, если вы хотите внести некоторые изменения в значение на основе существующего значения столбца, используйте
ALTER TABLE dbo.TableName ADD NewColumn AS (OldColumn * 1.5) PERSISTED;
источник
В моем случае я хочу добавить новый непустой уникальный столбец с именем CODE, но я не знаю значения во время создания. Я устанавливаю для него значение по умолчанию, получая значение по умолчанию из NewID (), а затем обновляю его позже.
ALTER TABLE [WIDGET] ADD [CODE] CHAR(5) NOT NULL DEFAULT(SUBSTRING(CONVERT(CHAR(36), NEWID()), 1, 5)) ALTER TABLE [dbo].[WIDGET] WITH CHECK ADD CONSTRAINT [UQ_WIDGET_CODE] UNIQUE ([CODE])
источник
Я думаю, что это сработает, если вы используете
Set Identity_Insert <TableName> OFF
и после написанного вами оператора вставки просто используйтеSet Identity_Insert <TableName> ON
.источник