将列添加到默认值等于现有列的值的表中
如何将列添加到默认值等于现有列的值的SQL Server表?
我试过这个T-SQL语句:
ALTER TABLE tablename ADD newcolumn type NOT NULL DEFAULT (oldcolumn)
但它给出了一个错误:
在这种情况下不允许使用名称“oldcolumn”。 有效expression式是常量,常量expression式和(在某些上下文中)variables。 列名是不允许的。
尝试这个:
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
由于额外的UPDATE
语句, AFTER INSERT
触发器方法涉及开销。 我build议使用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
列是自动标识列,这不起作用。
为了扩展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
如果你的types是varchar,nvarchar,datetime,或者其他types的任何兼容数据,用'noData'replace-9999:具体的值不重要,它将被第二条指令擦除。
我认为这将工作,如果您使用Set Identity_Insert <TableName> OFF
并在您写的插入语句后使用Set Identity_Insert <TableName> ON
。