如果我在Microsoft SQL Server Management Studio中尝试此操作,如果表中存在现有数据,则会出错:
不允许保存更改。您所做的更改需要删除并重新创建以下表。您已对无法重新创建的表进行了更改,或者启用了“禁止保存需要重新创建表的更改”选项。
是否可以手动完成此操作而不丢弃表格?
答案 0 :(得分:2)
如果所有行都将为此新列接收相同的非NULL值,则可以使用默认约束添加非NULL列:
alter table T add NewColumn int not null constraint DF_T_NewColumn DEFAULT 1
然后由您决定是否希望保留此默认约束,或者在列已填充后删除它:
alter table T drop constraint DF_T_NewColumn
如果你想为每一行计算不同的值,替代方案(在your answer)中显示可能更合适,但你应该知道它必须扫描整个表在你的3个步骤中至少两次 - 一次设置新值然后再次,以便在更改列的可为空性时验证它们都是非NULL。
答案 1 :(得分:1)
一种方法是手动完成。
步骤1:添加列,让它为" null" (别担心,我们稍后会改变这种情况)。
ALTER TABLE [dbo].[MyTable] ADD MyColumnName int NULL
步骤2:将列的内容更新为默认值:
UPDATE [dbo].[MyTable] SET MyColumn=1 where MyColumnName is NULL
步骤3:将列设置为" not null" (现在通过,因为列中没有空项):
ALTER TABLE [dbo].[MyTable] ALTER COLUMN MyColumn int NOT NULL
答案 2 :(得分:1)
如果在表定义的末尾添加列,则可以在SSMS中添加列。如果在现有列之间添加列,则SQL必须在“引擎盖”下执行大量操作以获取该列顺序:创建新表,复制所有数据,删除原始表,然后重命名新表。如果您拥有包含大量数据的大型数据,则可能需要很长时间(并且SSMS可能会超时)。