Sql server 在MSSQL中,如何将列添加到类型为“的表中?”;“不为空”;,表中是否有现有数据?

Sql server 在MSSQL中,如何将列添加到类型为“的表中?”;“不为空”;,表中是否有现有数据?,sql-server,tsql,ssms,Sql Server,Tsql,Ssms,如果在Microsoft SQL Server Management Studio中尝试此操作,如果表中存在现有数据,则会出现错误: 不允许保存更改。您所做的更改需要删除并重新创建以下表。您对无法重新创建的表进行了更改,或者启用了“防止保存需要重新创建表的更改”选项 是否可以在不删除表格的情况下手动执行此操作?一种方法是手动执行 步骤1:添加列,并将其设为“null”(别担心,我们稍后会更改) 步骤2:将列的内容更新为默认值: UPDATE [dbo].[MyTable] SET MyColu

如果在Microsoft SQL Server Management Studio中尝试此操作,如果表中存在现有数据,则会出现错误:

不允许保存更改。您所做的更改需要删除并重新创建以下表。您对无法重新创建的表进行了更改,或者启用了“防止保存需要重新创建表的更改”选项


是否可以在不删除表格的情况下手动执行此操作?

一种方法是手动执行

步骤1:添加列,并将其设为“null”(别担心,我们稍后会更改)

步骤2:将列的内容更新为默认值:

UPDATE [dbo].[MyTable] SET MyColumn=1 where MyColumnName is NULL
步骤3:将列设置为“NOTNULL”(由于列中没有null项,因此现在通过此操作):


如果所有行都将为此新列接收相同的非空值,则可以添加具有默认约束的非空列:

alter table T add NewColumn int not null constraint DF_T_NewColumn DEFAULT 1
然后由您决定是保留此默认约束,还是在填充列后删除它:

alter table T drop constraint DF_T_NewColumn


如果要为每一行计算不同的值,则备选方案(中显示)可能更合适,但是您应该知道,在您的3个步骤中,它必须至少扫描整个表两次—一次设置新值,然后再次检查,以便在更改列的可空性时验证它们是否都为非空。

如果在表定义的末尾添加列,则可以在SSMS中添加列。如果在现有列之间添加列,SQL必须在“幕后”执行很多操作才能获得该列的顺序:创建一个新表,复制所有数据,删除原始表,然后重命名新表。如果您有一个包含大量数据的大数据,则可能需要很长时间(而且SSMS可能会超时)。

回答得好,我很快就会接受它作为正式数据。谢谢!很高兴知道SSM可以做到这一点,而无需编写TSQL。
alter table T add NewColumn int not null constraint DF_T_NewColumn DEFAULT 1
alter table T drop constraint DF_T_NewColumn