如何在默认值等于现有列值的情况下向SQL Server表中添加列?
我尝试了以下T-SQL语句:
ALTER TABLE tablename
ADD newcolumn type NOT NULL DEFAULT (oldcolumn)
但它给出了一个错误:
在这种情况下,不允许使用名称“ oldcolumn”。有效表达式是常量,常量表达式和(在某些情况下)变量。不允许使用列名。
如何在默认值等于现有列值的情况下向SQL Server表中添加列?
我尝试了以下T-SQL语句:
ALTER TABLE tablename
ADD newcolumn type NOT NULL DEFAULT (oldcolumn)
但它给出了一个错误:
在这种情况下,不允许使用名称“ oldcolumn”。有效表达式是常量,常量表达式和(在某些情况下)变量。不允许使用列名。
UPDATE
恐怕您必须单独进行此操作。
Answers:
试试这个:
ALTER TABLE tablename ADD newcolumn type NOT NULL DEFAULT (0)
Go
Update tablename SET newcolumn = oldcolumn Where newcolumn = 0
Go
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
要扩展Kapil的答案并避免不必要的默认约束,请尝试以下操作:
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
如果您的类型是varchar,nvarchar,datetime或其他类型的任何兼容数据,则将-9999替换为“ noData”:特定值无关紧要,它将被第二条指令擦除。
就我而言,我想添加一个新的非空唯一列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])